During the Summer of 2021, data from ICE facility inspections was compiled into a series of spreadsheets. The impetus for the project was Nathan Craig who was interested in collating the data to examine them for trends, patterns, and anomalies. The work was performed by three students funded under a National Science Foundation grant awarded to Dr. Neil Harvey (NMSU) and Dr. Jeremy Slack (NMSU). The students who performed the work were Juan Becerra (Stanford), Avigail Turima Romo (Columbia), and Daniela Navarro Verdugo (CSSLO). The three students worked with Nathan Craig (NMSU and AVID) to develop a workflow for compiling individual report significant incident summary forms and inspection cover letters into a series of spreadsheets.

This document is a preliminary proof of concept and initial exploratory data analysis (Tukey 1977). Goals of the document are to:

  • illustrate the kinds of analysis possible with the tabulation of ICE inspection data
  • demonstrate code for reading the spreadsheet
  • show specific wrangling methods unique to the data structure
  • provide preliminary exploratory plot of select variables from the Significant Incident Summary Sheets.

The data are presently incomplete and represent results compiled as of 2021-06-24.

# Load necessary libraries

# Reading and wrangling
library(googlesheets4)
library(readr)
library(tidyverse)
library(janitor)
library(lubridate)
library(DT)

# Plotting
library(ggplot2)
library(RColorBrewer)

# Tables
library(kableExtra)

1 Introduction

1.1 Method for Reading G-324A-19-inc form

The code for this report is specific to data logged in the G-324A-19 form and the incident summaries portion of that form. The incident summary portion of this form is probably the most complex data structure in the project and also contains the largest volume of quantitative information. Therefore, it seemed like a good place to start with an initial proof of concept.

At the outset, there were issues reading in the Google Sheet. Several of the numeric columns read into R as lists which was undesirable. In the Google Sheet, Craig set the columns to plain text rather than auto and the data read in fine as character columns. This seemed to resolve the issue for a time, and it was possible to use the type_convert() function from the readr library (Wickham and Hester 2020) to convert these columns to numbers. Additional steps were taken to use the read_sheet function of the googlesheets4 library (Bryan 2021) to explicitly set the column types to character.

There were also some issues using lubridate (Spinu, Grolemund, and Wickham 2021) to wrangle the month and year fields to a proper date. Craig was not able to discern the cause of the issue. However, changing the month format on the incident sheet from abbreviated to fully written out months solved the issue. Those changes were made in the master Google Sheet and the data were called using the googlesheets4 library.

# Read in Sheet G-324A-19
df_324 <- read_sheet("https://docs.google.com/spreadsheets/d/1im5VSi3bIEi13O8WQ56wEIXSyNEstbGMylXXgD9bAG0/edit#gid=1858227071",
                 sheet="G-324A-19",
                 col_names = TRUE,
                 col_types = "c") %>% 
  clean_names() %>% 

  # Clean up the facility names separating out inspection date and state
  # Note the use of a double escape character. This was necessary.
  separate(.,
           col = facility,
           into = c("facility","inspection_date"),
           sep = "\\) - ") %>%
  separate(.,
           col = facility,
           into = c("facility","state"),
           sep = "\\(") %>% 

  # Convert the character type cols to numbers
  # type_convert() %>%
  mutate(facility = as.factor(facility),
         state = as.factor(state),
         date = mdy(inspection_date),
         current_inspection_date_from = mdy(current_inspection_date_from),
         current_inspection_date_to = mdy(current_inspection_date_to)
         ) %>% 
  relocate(date, .before = inspection_date) %>% 
  mutate_at(c(20:49), as.numeric)
# Read Google Sheet incident worksheet, convert to data frame, and wrangle
df_324_inc <- read_sheet("https://docs.google.com/spreadsheets/d/1im5VSi3bIEi13O8WQ56wEIXSyNEstbGMylXXgD9bAG0/edit#gid=1858227071",
                 sheet="G-324A-19-inc",
                 col_types = "c") %>% 
  clean_names() %>% 

  # Clean up the facility names separating out inspection date and state
  # Note the use of a double escape character. This was necessary.
  separate(.,
           col = facility,
           into = c("facility","inspection_date"),
           sep = "\\) - ") %>%
  separate(.,
           col = facility,
           into = c("facility","state"),
           sep = "\\(") %>% 

  # Convert the character type cols to numbers
  # type_convert() %>% 
  unite(date, year:month) %>% 
  mutate(facility = as.factor(facility),
         state = as.factor(state),
         date = ym(date)
         ) %>% 
  mutate_at(c(6:76), as.numeric)

At present 170 out of approximately 300 are complete. The inspections range in time from 2019-08-22 to 2021-04-08.

1.2 Summary Tables

Summary tables help to provide an overview of how many instances occur within particular category of data or how frequent a particular issue is recorded at a given facility. Summary tables are generated using a combination of group_by with summarize with the results piped to kable and kableExtra.

df_facility <- df_324 %>% 
  group_by(facility) %>% 
  summarise(n_inspections = n()) %>% 
  ungroup() 
  
df_facility %>% 
  kable(caption = "Inspections Reviewed by Facility",
        col.names = c("Facility", "Inspections Reviewed")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive")) %>% 
  scroll_box(height = "300px")
Table 1.1: Inspections Reviewed by Facility
Facility Inspections Reviewed
Adams County Correctional Center 2
Adelanto ICE Processing Center - East 2
Adelanto ICE Processing Center - West 2
Alamance County Detention Center 1
Alamance County Jail 1
Allen Parish Public Safety Complex 2
Aurora ICE Processing Center 2
Aurora ICE Processing Center II - Annex 2
Baker County Detention Center 1
Bergen County Jail 2
Bluebonnet Detention Center 1
Boone County Jail 2
Bossier Parish Corrections Center 1
Bristol County Jail and House of Correction 1
Brooks County Detention Center 1
Broward Transitional Center 2
Butler County Jail 1
Calhoun County Correctional Center 1
Calhoun County Jail 1
Cambria County Prison 1
Caroline Detention Facility 1
Carver County Jail 1
Cass County Jail 1
Catahoula Correctional Center 2
CCA Florence Correctional Center 1
Chase County Detention Center 1
Chippewa County Correctional Facility 1
Christian County Jail 1
Cibola County Correctional Center 1
Clay County Justice Center 1
Clinton County Correctional Facility 2
Coastal Bend Detention Center 1
David L. Moss Criminal Justice Center 1
Desert View Annex 1
Dodge County Detention Facility 1
Donald W. Wyatt Detention Center 1
Donald W. Wyatt Detention Facility 1
Dorchester County Detention Center 1
Douglas County Department of Corrections 1
East Hidalgo Detention Center 1
Eden Detention Center 1
El Paso Service Processing Center 2
El Valle Detention Facility 1
Elizabeth Contract Detention Facility 2
Eloy Detention Center 2
Essex County Corrections Facility 2
Etowah County Jail 1
Farmville Detention Center 1
Florence SPC 1
Folkston ICE Processing Center 1
Folkston ICE Processing Center Annex 1
Freeborn County Adult Detention Center 1
Geauga County Jail 2
Glades County Detention Center 1
Golden State Annex 1
Hall County Department of Corrections 1
Hardin County Jail 2
Henderson Detention Center 1
Houston CDF 1
Houston Contract Detention Facility 1
Howard County Detention Center 1
Hudson County Corrections and Rehabilitation Center 1
Imperial Regional Detention Facility 2
Irwin County Detention Center 1
Jackson Parish Correctional Center 2
Jena LaSalle Detention Facility 1
Jerome Combs Detention Center 2
Joe Corley Detention Facility 1
Joe Corley Processing Center 1
Johnson County Corrections Center 1
Kay County Detention Center 2
Krome Service Processing Center 2
La Palma Correctional Center 1
Laredo Processing Center 1
LaSalle Correctional Center 1
LaSalle County Regional Detention Center 1
LaSalle ICE Processing Center 1
Limestone County Detention Center 2
McHenry County Adult Correctional Facility 1
Mesa Verde ICE Processing Facility 1
Monroe County Inmate Dormitory 1
Montgomery County Jail 1
Montgomery Processing Center 2
Morgan County Adult Detention Center 1
Morrow County Correctional Facility 1
Northern Oregon Correctional Facility 1
Northwest Contract Detention Center 1
Nye County Detention Center 1
Okmulgee County Jail - Moore Detention Facility 1
Orange County Jail 1
Otay Mesa Detention Facility 2
Otero County Processing Center 2
Pike County Correctional Facility 1
Pine Prairie ICE Processing Center 1
Platte County Detention Center 1
Plymouth County Correctional Facility 1
Polk County Adult Detention Center 2
Port Isabel Service Processing Center 2
Prairieland Detention Center 2
Pulaski County Detention Center 1
Richwood Correctional Center 2
Rio Grande Processing Center 1
River Correctional Center 2
Robert A. Deyton Detention Facility 2
Rolling Plains Detention Center 1
Saint Clair County Jail 1
San Luis Regional Detention Center 1
Seneca County Jail 2
Shawnee County Department of Corrections - Adult Detention Center 1
Sherburne County Jail 2
Sheriff Al Cannon Detention Center 1
South Louisiana ICE Processing Center 2
South Texas ICE Processing Center 1
Stewart Detention Center 1
Strafford County Corrections 2
Teller County Jail 1
Torrance County Detention Facility 1
Tulsa County Jail - David L. Moss Criminal Jutice Center 1
Val Verde Correctional Facility 1
Wakulla County Detention Facility 2
Washoe County Detention Center 1
Webb County Detention Center 1
Webb County Detention Facility 1
West Texas Detention Facility 1
Western Tennessee Detention Facility 1
Willacy County Regional Detention Facility 1
Winn Correctional Center 2
Worcester County Jail 1
York County Prison 2
Yuba County Jail 2

1.3 Facet Plots

Facet plots are produced for several categories of data. Within each category, columns are pivoted longer and plotted by date. Graphing is done using the ggplot2 library (Wickham et al. 2021) with the facet_wrap function to provide a means to compare multiple facilities simultaneously. Such a plot can help identify trends and guide more specific questions.

2 Assaults

The ICE G-324A Significant Incident Summary sheet contains information on a number of different kinds of assaults. Specifically, there are four categories of assaults listed:

  • Detained Person on Staff with Serious Injury
  • Detained Person on Staff without Serious Injury
  • Detained Person on Detained Person with Serious Injury
  • Detained Person on Detained Person without Serious Injury

Conspicuously absent from this list of assault types are assaults on detained persons by staff. This is deeply concerning because already initial review of inspection forms and prior news stories indicates that staff assaults on detained persons do occur. For example, at the Bristol County County Jail and House of Corrections independent investigation by the Massachusetts Office of Attorney General (MAOG) found that facility staff found a “planned and deliberate-use of force against the ICE detainees that was disproportionate to the security needs at that time and unnecessarily caused, or risked causing, harm to all involved” (MA AG 2020, ii). The MOAG found that facility staff used “a flash bang grenade, pepper-ball launchers, pepper spray canisters, anti-riot shields, and canines–against detainees who had exhibited calm and nonviolent behavior for at least an hour before this operation” (MA AG 2020, ii). Investigations found that staff “deployed these weapons both indiscriminately upon entry and also specifically against detainees who were not combative, assaultive, or otherwise actively resisting staff” (MA AG 2020, ii).

While the aforementioned Bristol County Jail may be a particularly egregious instance of staff assaulting detained persons, it is not an isolated case. For example, video evidence from the Torrance County Detention Facility in Estancia NM shows CoreCivic’s private facility staff pepper spraying persons detained by ICE on hunger strike (Swetlitz 2020). Review of inspections has also revealed additional inappropriate use of force incidents. The omission of a field to record instances of staff assaulting detained persons occludes and obscures real instances of violence. As the inspections process is a detention reform designed to make a more humane system of civil incarceration, the omission of categories for logging staff physical mistreatment of detained persons raises serious questions about the inspections processes ability to record significant and documented civil and human rights violations.

2.1 Summary Tables

df_assaults <- df_324_inc %>%
  
  # Subset the df to only the used cols
  select(id, facility, date,
       detainee_physical_assault_on_staff_with_serious_injury:
       detainee_on_detainee_physical_assault_fight_with_no_serious_injury
       ) %>% 
  
  # Need the rowwise function to compute a row-at-a-time
  # in the following mutate function
  rowwise(id) %>% 
  
  # Create a new total column
  mutate(total_assaults = sum(c_across(
       detainee_physical_assault_on_staff_with_serious_injury:
       detainee_on_detainee_physical_assault_fight_with_no_serious_injury
  ))) %>% 

  # Call a range of table columns and pivot long
  pivot_longer(.,
               cols=  detainee_physical_assault_on_staff_with_serious_injury:total_assaults,
               names_to = "assault_type",
               values_to = "assault_count") %>% 
  
  # Remove NA Values
  drop_na() %>% 
  
  # Explicitly define factor levels
  mutate(assault_type = factor(assault_type, levels = c(
    "detainee_physical_assault_on_staff_with_serious_injury",
    "detainee_physical_assault_on_staff_with_no_serious_injury",
    "detainee_on_detainee_physical_assault_fight_with_serious_injury",
    "detainee_on_detainee_physical_assault_fight_with_no_serious_injury",
    "total_assaults"
  )))
df_assaults %>% 
  group_by(assault_type) %>% 
  summarise(`Total Assaults by Type` = sum(assault_count)) %>% 
  ungroup() %>% 
  kable(caption = "Total Assaults by Type",
        col.names = c("Assault Type", "Total Assault Type")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive"))
Table 2.1: Total Assaults by Type
Assault Type Total Assault Type
detainee_physical_assault_on_staff_with_serious_injury 12
detainee_physical_assault_on_staff_with_no_serious_injury 311
detainee_on_detainee_physical_assault_fight_with_serious_injury 123
detainee_on_detainee_physical_assault_fight_with_no_serious_injury 2795
total_assaults 3233
df_assaults %>% 
  group_by(facility) %>% 
  summarise(total_assaults = sum(assault_count)) %>% 
  arrange(desc(total_assaults)) %>% 
  ungroup() %>% 
  kable(caption = "Total Assaults by Facility",
        col.names = c("Facility", "Total Assaults by Facility")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive")) %>% 
  scroll_box(height = "300px")
Table 2.1: Total Assaults by Facility
Facility Total Assaults by Facility
Krome Service Processing Center 470
Adelanto ICE Processing Center - West 390
Prairieland Detention Center 330
South Texas ICE Processing Center 312
Adelanto ICE Processing Center - East 264
Otero County Processing Center 240
Aurora ICE Processing Center 222
Aurora ICE Processing Center II - Annex 222
Eloy Detention Center 216
Stewart Detention Center 206
Otay Mesa Detention Facility 200
El Paso Service Processing Center 192
Winn Correctional Center 172
Imperial Regional Detention Facility 136
LaSalle ICE Processing Center 128
Farmville Detention Center 108
Hudson County Corrections and Rehabilitation Center 98
Jena LaSalle Detention Facility 98
River Correctional Center 96
Yuba County Jail 96
Adams County Correctional Center 94
La Palma Correctional Center 92
Caroline Detention Facility 90
Essex County Correctional Facility 90
Catahoula Correctional Center 72
Mesa Verde ICE Processing Facility 72
Northwest Contract Detention Center 72
Port Isabel Service Processing Center 70
Folkston ICE Processing Center 68
Bluebonnet Detention Center 64
Montgomery Processing Center 60
Sherburne County Jail 60
Essex County Corrections Facility 56
Bergen County Jail 52
Pine Prairie ICE Processing Center 52
Limestone County Detention Center 50
Polk County Adult Detention Center 50
Irwin County Detention Center 48
McHenry County Adult Correctional Facility 48
Strafford County Corrections 46
Allen Parish Public Safety Complex 45
Baker County Detention Center 34
Elizabeth Contract Detention Facility 34
Houston Contract Detention Facility 32
CCA Florence Correctional Center 30
Pike County Correctional Facility 30
Wakulla County Detention Facility 30
Johnson County Corrections Center 28
Tulsa County Jail - David L. Moss Criminal Jutice Center 28
Houston CDF 26
Richwood Correctional Center 26
Bossier Parish Corrections Center 24
Folkston ICE Processing Center Annex 24
Okmulgee County Jail - Moore Detention Facility 24
Pulaski County Detention Center 24
Clinton County Correctional Facility 22
Jackson Parish Correctional Center 22
Nye County Detention Center 22
Bristol County Jail and House of Correction 20
Joe Corley Processing Center 20
Morgan County Adult Detention Center 20
Orange County Jail 20
Plymouth County Correctional Facility 20
Cambria County Prison 18
Freeborn County Adult Detention Center 18
Glades County Detention Center 16
Hall County Department of Corrections 16
Webb County Detention Center 16
Webb County Detention Facility 16
York County Prison 16
Calhoun County Correctional Center 14
Florence SPC 14
Henderson Detention Center 14
Seneca County Jail 14
Broward Transitional Center 12
Butler County Jail 12
Hardin County Jail 12
Torrance County Detention Facility 12
Coastal Bend Detention Center 10
Dodge County Detention Facility 10
Eden Detention Center 10
El Valle Detention Facility 10
Howard County Detention Center 10
Joe Corley Detention Facility 10
Sheriff Al Cannon Detention Center 8
Worcester County Jail 7
Donald W. Wyatt Detention Center 6
Geauga County Jail 6
Jerome Combs Detention Center 6
Kay County Detention Center 6
Montgomery County Jail 6
Saint Clair County Jail 6
Val Verde Correctional Facility 6
Northern Oregon Correctional Facility 4
San Luis Regional Detention Center 4
Boone County Jail 2
Carver County Jail 2
Cass County Jail 2
Clay County Justice Center 2
Laredo Processing Center 2
Monroe County Inmate Dormitory 2
Rolling Plains Detention Center 2
Shawnee County Department of Corrections - Adult Detention Center 2
South Louisiana ICE Processing Center 2
Teller County Jail 2
West Texas Detention Facility 2
Alamance County Detention Center 0
Brooks County Detention Center 0
Christian County Jail 0
Cibola County Correctional Center 0
David L. Moss Criminal Justice Center 0
Douglas County Department of Corrections 0
East Hidalgo Detention Center 0
Golden State Annex 0
LaSalle Correctional Center 0
LaSalle County Regional Detention Center 0
Morrow County Correctional Facility 0
Platte County Detention Center 0
Rio Grande Processing Center 0
Robert A. Deyton Detention Facility 0
Washoe County Detention Center 0
Western Tennessee Detention Facility 0
Willacy County Regional Detention Facility 0

2.2 Facet of Assaults by Plot

The figure below is a facet plot of the assault categories present on the G-324A SIS form.

# Generating a linetype vector for use in the plot
plot_lines <- c(
    "solid",
    "solid",
    "solid",
    "solid",
    "dotted"
    )

# Use Color Brewer to set colors and modify
# the last color to be black for totals.
plot_colors <- brewer.pal(5, "Paired")
plot_colors[5] <- "#000000"

# Create the labels
plot_labels <- c(
    "Detained Person on Staff w. Serious Injury",
    "Detained Person on Staff w/o Serious Injury",
    "Detained Person on Detained Person w. Serous Injury",
    "Detained Person on Detained Person w/o Serous Injury",
    "Total Assaults")

df_assaults %>% 
  # Calling the plot and formatting
  ggplot(aes(x=date, y = assault_count, linetype=assault_type))+
  geom_line(aes(color = assault_type), size =.65) +
  
  # Set the line type
  scale_linetype_manual(
    values = plot_lines,
    labels = plot_labels,
    name = "Assault Type:",
    guide = guide_legend(nrow = 5)
    )+
  
  # Setting the color
  scale_color_manual(
    values = plot_colors,
    labels = plot_labels,
  name = "Assault Type:"
  )+

  labs(title = "Reported Assaults")+
  ylab("Number of Assaults")+
  xlab("Date")+
  theme(
    strip.text = element_text(size = 8),
    legend.position = "bottom"
    )+

  # Set the legend to multiple rows
  guides(col = guide_legend(nrow =5))+
  
  # Wrap
  facet_wrap(~ facility, ncol=3)

3 Disciplinary

As a matter of law, ICE detention is not punitive it is purely administrative civil holding to ensure that individuals are present for their immigration proceedings. Despite that fact, there is a tremendous amount of punitive disciplinary measures that take place in ICE detention. Some of this information on discipline in ICE detention is logged in facility inspections. As seen in the tables below, during the current sample period there were more than 42,000 disciplinary infractions.

3.1 Summary Tables

df_discipline <- df_324_inc %>%
  
  # Subset the df to only the used cols
  select(id, facility, date,
       disciplinary_infractions:
       sanctions_over_60_days
       ) %>% 
  
  # Need the rowwise function to compute a row-at-a-time
  # in the following mutate function
  rowwise(id) %>% 
  
  # Create a new total column
  mutate(total_disciplinary = sum(c_across(
       disciplinary_infractions:
       sanctions_over_60_days
  ))) %>% 

  # Call a range of table columns and pivot long
  pivot_longer(.,
               cols=  disciplinary_infractions:total_disciplinary,
               names_to = "disciplinary_type",
               values_to = "disciplinary_count") %>%
  
  # Remove NA values
  drop_na() %>% 
  
  # Explicitly set factor levels
  mutate(disciplinary_type = factor(disciplinary_type, levels =c(
    "disciplinary_infractions",
    "disciplinary_infractions_guilty",
    "disciplinary_appeals",
    "disciplinary_appeals_found_in_favor_of_detainee",
    "sanctions_over_60_days",
    "total_disciplinary"
  )))
df_discipline %>% 
  group_by(disciplinary_type) %>% 
  summarise(`Total Disciplinary by Type` = sum(disciplinary_count)) %>% 
  ungroup() %>% 
  kable(caption = "Total Disciplinary by Type",
        col.names = c("Discipline Type", "Total Discipline Type")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive"))
Table 3.1: Total Disciplinary by Type
Discipline Type Total Discipline Type
disciplinary_infractions 23396
disciplinary_infractions_guilty 18274
disciplinary_appeals 1093
disciplinary_appeals_found_in_favor_of_detainee 281
sanctions_over_60_days 30
total_disciplinary 42363
df_discipline %>% 
  group_by(facility) %>% 
  summarise(total_disciplinary = sum(disciplinary_count)) %>% 
  arrange(desc(total_disciplinary)) %>% 
  ungroup() %>% 
  kable(caption = "Total Discipline by Facility",
        col.names = c("Facility", "Total Discipline by Facility")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive")) %>% 
  scroll_box(height = "300px")
Table 3.1: Total Discipline by Facility
Facility Total Discipline by Facility
Eloy Detention Center 7128
La Palma Correctional Center 6954
Krome Service Processing Center 4888
Sherburne County Jail 4070
Farmville Detention Center 3808
Yuba County Jail 3712
Aurora ICE Processing Center 2678
Aurora ICE Processing Center II - Annex 2678
Otay Mesa Detention Facility 2504
Stewart Detention Center 2268
Winn Correctional Center 2264
Montgomery Processing Center 2060
Bluebonnet Detention Center 1926
Otero County Processing Center 1924
South Texas ICE Processing Center 1912
Prairieland Detention Center 1596
Adelanto ICE Processing Center - West 1284
El Paso Service Processing Center 1246
Imperial Regional Detention Facility 1240
Jena LaSalle Detention Facility 1234
LaSalle ICE Processing Center 1176
Clinton County Correctional Facility 1166
Caroline Detention Facility 1116
Bristol County Jail and House of Correction 1048
Polk County Adult Detention Center 1010
Bergen County Jail 984
Northwest Contract Detention Center 958
Essex County Corrections Facility 900
Port Isabel Service Processing Center 848
Calhoun County Correctional Center 836
Glades County Detention Center 822
Folkston ICE Processing Center 814
River Correctional Center 810
McHenry County Adult Correctional Facility 796
Adams County Correctional Center 756
Adelanto ICE Processing Center - East 742
Laredo Processing Center 684
Irwin County Detention Center 680
York County Prison 586
Butler County Jail 566
Folkston ICE Processing Center Annex 502
Tulsa County Jail - David L. Moss Criminal Jutice Center 498
Mesa Verde ICE Processing Facility 482
Pike County Correctional Facility 464
Pine Prairie ICE Processing Center 448
Torrance County Detention Facility 420
Essex County Correctional Facility 404
Strafford County Corrections 400
Hudson County Corrections and Rehabilitation Center 376
Dodge County Detention Facility 352
Pulaski County Detention Center 346
Freeborn County Adult Detention Center 312
Orange County Jail 298
Plymouth County Correctional Facility 252
Houston CDF 240
Houston Contract Detention Facility 240
Jackson Parish Correctional Center 234
Eden Detention Center 230
Baker County Detention Center 216
Johnson County Corrections Center 204
CCA Florence Correctional Center 186
Limestone County Detention Center 176
Okmulgee County Jail - Moore Detention Facility 176
Webb County Detention Facility 174
Florence SPC 168
Broward Transitional Center 166
Joe Corley Detention Facility 164
Allen Parish Public Safety Complex 158
Elizabeth Contract Detention Facility 152
Webb County Detention Center 148
Kay County Detention Center 144
Henderson Detention Center 136
Hardin County Jail 132
Wakulla County Detention Facility 128
Donald W. Wyatt Detention Center 126
Worcester County Jail 125
El Valle Detention Facility 124
Jerome Combs Detention Center 122
Catahoula Correctional Center 88
Geauga County Jail 88
Bossier Parish Corrections Center 80
Montgomery County Jail 80
Nye County Detention Center 76
Hall County Department of Corrections 66
Cambria County Prison 64
Seneca County Jail 62
Howard County Detention Center 54
Joe Corley Processing Center 50
Cibola County Correctional Center 48
Cass County Jail 40
Coastal Bend Detention Center 40
Morgan County Adult Detention Center 40
Washoe County Detention Center 40
Richwood Correctional Center 28
South Louisiana ICE Processing Center 28
Sheriff Al Cannon Detention Center 24
Carver County Jail 22
Saint Clair County Jail 20
Northern Oregon Correctional Facility 18
Shawnee County Department of Corrections - Adult Detention Center 18
Rio Grande Processing Center 16
Rolling Plains Detention Center 12
Christian County Jail 8
Monroe County Inmate Dormitory 8
San Luis Regional Detention Center 8
Teller County Jail 8
West Texas Detention Facility 8
Alamance County Detention Center 0
Boone County Jail 0
Brooks County Detention Center 0
Clay County Justice Center 0
David L. Moss Criminal Justice Center 0
East Hidalgo Detention Center 0
Golden State Annex 0
LaSalle Correctional Center 0
LaSalle County Regional Detention Center 0
Morrow County Correctional Facility 0
Platte County Detention Center 0
Robert A. Deyton Detention Facility 0
Val Verde Correctional Facility 0
Western Tennessee Detention Facility 0
Willacy County Regional Detention Facility 0

3.2 Facet Plot of Disciplinary by Facility

# Generating a linetype vector for use in the plot
plot_lines <- c(
    "solid",
    "solid",
    "solid",
    "solid",
    "solid",
    "dotted"
    )

# Use Color Brewer to set colors and modify
# the last color to be black for totals.
plot_colors <- brewer.pal(6, "Paired")
plot_colors[6] <- "#000000"

# Create plot labels

plot_labels <- c(
    "Disciplinary Infractions",
    "Disciplinary Infractions - Guilty",
    "Disciplinary Appeals",
    "Disciplinary Appeals in Favor of Detainee",
    "Sanctions Over 60 Days",
    "Total Disciplinary")


df_discipline %>% 
  
  # Calling the plot and formatting
  ggplot(aes(x=date,
             y = disciplinary_count,
             linetype = disciplinary_type))+
  geom_line(aes(color = disciplinary_type), size = .65) +
  
  # Set the linetype
  scale_linetype_manual(
    values = plot_lines,
    labels = plot_labels,
    name = "Disciplinary Type:",
    guide = guide_legend(nrow = 6)
    )+
  
  # Setting the color
  scale_color_manual(
  values = plot_colors,
  labels = plot_labels,
  name = "Disciplinary Type:"
  )+

  labs(title = "Disciplinary")+
  ylab("Number of Disciplinary Infractions")+
  xlab("Date")+
  theme(
    strip.text = element_text(size = 8),
    legend.position = "bottom"
    )+

  # Set the legend to multiple rows
  guides(col = guide_legend(nrow =6))+
  
  # Wrap
  facet_wrap(~ facility, ncol=3)

4 Solitary

4.1 Summary Tables

Of the present 163 inspections reviewed so far, there are more than 34,000 instances of solitary. That is roughly 208 instances of solitary per inspection.

df_solitary <- df_324_inc %>%
  
  # Select a subset of columns to work with
  select(id,
         facility,
         date,
         detainees_placed_in_administrative_segregation:
           detainees_placed_in_segregation_for_mental_health_reasons) %>% 
  
  # Need the rowwise function to compute a row-at-a-time
  # in the following mutate function
  rowwise(id) %>% 
  
  # Create new total column
  mutate(total_segregation = sum(c_across(detainees_placed_in_administrative_segregation:
                 detainees_placed_in_segregation_for_mental_health_reasons))) %>% 
  
  # Tidy
  pivot_longer(.,
               cols= detainees_placed_in_administrative_segregation:
                 total_segregation,
               names_to = "segregation_type",
               values_to = "segregation_count") %>% 
  
  # Remove NA
  drop_na() %>% 
  
  # Explicitly set factor levels
  mutate(segregation_type = factor(segregation_type, levels = c(
    "detainees_placed_in_administrative_segregation",
    "detainees_placed_in_disciplinary_segregation",
    "detainees_placed_in_segregation_for_medical_reasons",
    "detainees_placed_in_segregation_for_mental_health_reasons",
    "total_segregation"
  )))
df_solitary %>% 
  group_by(segregation_type) %>% 
  summarise(`Total Solitary by Type` = sum(segregation_count)) %>% 
  ungroup() %>% 
  kable(caption = "Total Solitary by Type",
        col.names = c("Solitary Type", "Total Solitary Type")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive"))
Table 4.1: Total Solitary by Type
Solitary Type Total Solitary Type
detainees_placed_in_administrative_segregation 15798
detainees_placed_in_disciplinary_segregation 8885
detainees_placed_in_segregation_for_medical_reasons 8545
detainees_placed_in_segregation_for_mental_health_reasons 880
total_segregation 33785
df_solitary %>% 
  group_by(facility) %>% 
  summarise(total_segregation = sum(segregation_count)) %>% 
  arrange(desc(total_segregation)) %>% 
  ungroup() %>% 
  kable(caption = "Total Solitary by Facility",
        col.names = c("Facility", "Total Solitary by Facility")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive")) %>% 
  scroll_box(height = "300px")
Table 4.1: Total Solitary by Facility
Facility Total Solitary by Facility
Krome Service Processing Center 10882
Eloy Detention Center 4556
El Paso Service Processing Center 3310
Prairieland Detention Center 2788
Henderson Detention Center 2638
Winn Correctional Center 2474
Otero County Processing Center 2332
La Palma Correctional Center 2198
Adelanto ICE Processing Center - West 2178
Irwin County Detention Center 2172
South Texas ICE Processing Center 1696
Adams County Correctional Center 1456
River Correctional Center 1438
York County Prison 1418
Montgomery Processing Center 1324
Adelanto ICE Processing Center - East 1308
Otay Mesa Detention Facility 1266
Caroline Detention Facility 1250
Jackson Parish Correctional Center 1248
Aurora ICE Processing Center 1138
Aurora ICE Processing Center II - Annex 1138
Farmville Detention Center 1006
Imperial Regional Detention Facility 1006
Glades County Detention Center 974
Northwest Contract Detention Center 946
Port Isabel Service Processing Center 932
LaSalle ICE Processing Center 928
Sherburne County Jail 796
Catahoula Correctional Center 662
Stewart Detention Center 610
Jena LaSalle Detention Facility 602
Pike County Correctional Facility 598
Pine Prairie ICE Processing Center 472
McHenry County Adult Correctional Facility 462
Bluebonnet Detention Center 452
Baker County Detention Center 362
Wakulla County Detention Facility 342
Bristol County Jail and House of Correction 336
Polk County Adult Detention Center 296
Pulaski County Detention Center 276
Richwood Correctional Center 256
Florence SPC 234
Yuba County Jail 224
Bergen County Jail 218
Limestone County Detention Center 206
Clinton County Correctional Facility 196
Houston Contract Detention Facility 194
Houston CDF 178
Plymouth County Correctional Facility 176
Hudson County Corrections and Rehabilitation Center 174
El Valle Detention Facility 172
Freeborn County Adult Detention Center 172
Geauga County Jail 150
Allen Parish Public Safety Complex 142
LaSalle Correctional Center 140
Okmulgee County Jail - Moore Detention Facility 140
Johnson County Corrections Center 136
Saint Clair County Jail 134
Elizabeth Contract Detention Facility 132
Folkston ICE Processing Center 126
Essex County Correctional Facility 125
Dodge County Detention Facility 118
Joe Corley Detention Facility 110
Mesa Verde ICE Processing Facility 108
Calhoun County Correctional Center 106
Seneca County Jail 102
Kay County Detention Center 92
Nye County Detention Center 92
Donald W. Wyatt Detention Center 88
Essex County Corrections Facility 88
Jerome Combs Detention Center 88
Worcester County Jail 82
Eden Detention Center 78
Butler County Jail 72
Torrance County Detention Facility 58
Hardin County Jail 56
Bossier Parish Corrections Center 54
Tulsa County Jail - David L. Moss Criminal Jutice Center 46
Cambria County Prison 44
Montgomery County Jail 42
Strafford County Corrections 42
Washoe County Detention Center 42
Hall County Department of Corrections 40
Clay County Justice Center 36
CCA Florence Correctional Center 34
Webb County Detention Center 34
Cibola County Correctional Center 32
Folkston ICE Processing Center Annex 24
Cass County Jail 20
Morgan County Adult Detention Center 20
Webb County Detention Facility 20
Alamance County Detention Center 16
Laredo Processing Center 14
Northern Oregon Correctional Facility 14
Sheriff Al Cannon Detention Center 14
Carver County Jail 10
Howard County Detention Center 10
Joe Corley Processing Center 10
Boone County Jail 8
Orange County Jail 8
Golden State Annex 6
Shawnee County Department of Corrections - Adult Detention Center 6
Teller County Jail 6
Christian County Jail 4
Rolling Plains Detention Center 4
San Luis Regional Detention Center 4
Brooks County Detention Center 0
Broward Transitional Center 0
Coastal Bend Detention Center 0
David L. Moss Criminal Justice Center 0
Douglas County Department of Corrections 0
East Hidalgo Detention Center 0
LaSalle County Regional Detention Center 0
Monroe County Inmate Dormitory 0
Morrow County Correctional Facility 0
Platte County Detention Center 0
Rio Grande Processing Center 0
Robert A. Deyton Detention Facility 0
South Louisiana ICE Processing Center 0
Val Verde Correctional Facility 0
West Texas Detention Facility 0
Western Tennessee Detention Facility 0
Willacy County Regional Detention Facility 0

4.2 Facet Plots of Solitary by Facility

# Generating a linetype vector for use in the plot
plot_lines <- c(
    "solid",
    "solid",
    "solid",
    "solid",
    "dotted"
    )

# Use Color Brewer to set colors and modify
# the last color to be black for totals.
plot_colors <- brewer.pal(5, "Paired")
plot_colors[5] <- "#000000"

# Create plot labels
plot_labels <- c(
    "Administrative",
    "Disciplinary",
    "Medical",
    "Mental Health",
    "Total")

df_solitary %>% 

# Calling the plot and formatting
  ggplot(aes(x=date,
             y = segregation_count,
             linetype = segregation_type))+
  geom_line(aes(color = segregation_type), size = .65) +
  
  # Set the color
  scale_color_manual(
  values = plot_colors,
  name = "Solitary Type:",
  labels = plot_labels)+
  
  # Set the linetype
  scale_linetype_manual(
    values = plot_lines,
      name = "Solitary Type:",
    labels = plot_labels)+
  
  
  labs(title = "Reported Use of Solitary")+
  ylab("Number of Individuals Palced in Solitary")+
  xlab("Date")+
  theme(
    strip.text = element_text(size = 8),
    legend.position = "bottom"
    )+
    facet_wrap(~ facility, ncol=3)

4.3 Solitary Over 60 Days

# Use Color Brewer to set colors and modify
# the last color to be black for totals.
plot_colors <- brewer.pal(5, "Paired")
plot_colors[5] <- "#000000"

# Call the dataframe and select cols
df_324 %>% 
  select(id,
         facility,
         state,
         date,
         fac_operator,
         admin_seg_60_ice,
         disc_seg_60_ice) %>% 
  drop_na() %>% 
  
  # Need the rowwise function to compute a row-at-a-time
  # in the following mutate function
  rowwise(id) %>% 
  
  # Generate total col
  mutate(total_seg_60 = sum(c_across(
       admin_seg_60_ice:
       disc_seg_60_ice
  ))) %>%
  
  # Make tidy and filter
  pivot_longer(cols = admin_seg_60_ice:disc_seg_60_ice,
               names_to = "segregation_60_type",
               values_to = "segregation_60_count") %>%
  filter(segregation_60_type %in% c("admin_seg_60_ice", "disc_seg_60_ice")&
           segregation_60_count > 0) %>%
  
  # Initiate the plot and sort by sum
  ggplot(aes(x = segregation_60_count,
             y=reorder(fac_operator, segregation_60_count, sum),
             fill=segregation_60_type))+
  geom_bar(stat = "identity")+
  
  # Set the color fill
  scale_fill_brewer(type = "qual",
                    palette = "Paired",
                    name = "Segregation > 60 Type",
                    labels = c("Administrative",
                               "Disciplinary"))+
  labs(title= "Segregation > 60 Days by Facility Operator",
        x = "Segregation > 60 Days Count",
        y = "Facility Operator")+
  theme(legend.position = "bottom")

5 Use of Force

5.1 Summary Tables

df_force <- df_324_inc %>%
  
  # Subset the df to only the used cols
  select(id, facility, date,
       immediate_use_of_force_incidents:
       strip_searches
       ) %>% 
  
  # Need the rowwise function to compute a row-at-a-time
  # in the following mutate function
  rowwise(id) %>% 
  
  # Create a new total column
  mutate(total_use_of_force = sum(c_across(
       immediate_use_of_force_incidents:
       strip_searches
  ))) %>% 

  # Call a range of table columns and pivot long
  pivot_longer(.,
               cols=  immediate_use_of_force_incidents:total_use_of_force,
               names_to = "use_of_force_type",
               values_to = "use_of_force_count") %>%
  
  # Remove NA values
  drop_na() %>% 
  
  # Explicitly define factors
  mutate(use_of_force_type = factor(use_of_force_type, levels = c(
    "immediate_use_of_force_incidents",
    "calculated_use_of_force_incidents",
    "uses_of_force_with_chemical_agents",
    "incidents_where_non_lethal_weapons_were_used",
    "number_of_times_4_5_point_restraints_were_used",
    "use_of_force_with_serious_injury",
    "strip_searches",
    "total_use_of_force"
  )))
df_force %>% 
  group_by(use_of_force_type) %>% 
  summarise(`Total Use of Force by Type` = sum(use_of_force_count)) %>% 
  ungroup() %>% 
  kable(caption = "Total Use of Force by Type",
        col.names = c("Use of Force Type", "Total Use of Force Type")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive"))
Table 5.1: Total Use of Force by Type
Use of Force Type Total Use of Force Type
immediate_use_of_force_incidents 1106
calculated_use_of_force_incidents 311
uses_of_force_with_chemical_agents 333
incidents_where_non_lethal_weapons_were_used 16
number_of_times_4_5_point_restraints_were_used 76
use_of_force_with_serious_injury 2
strip_searches 20297
total_use_of_force 18694
df_force %>% 
  group_by(facility) %>% 
  summarise(total_use_of_force = sum(use_of_force_count)) %>% 
  arrange(desc(total_use_of_force)) %>% 
  ungroup() %>% 
  kable(caption = "Total Use of Force by Facility",
        col.names = c("Facility", "Total Use of Force by Facility")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive")) %>% 
  scroll_box(height = "300px")
Table 5.1: Total Use of Force by Facility
Facility Total Use of Force by Facility
Farmville Detention Center 10782
La Palma Correctional Center 6022
Sheriff Al Cannon Detention Center 4854
Worcester County Jail 3348
Hudson County Corrections and Rehabilitation Center 2294
York County Prison 2017
Cambria County Prison 1500
Essex County Correctional Facility 1456
Essex County Corrections Facility 1164
Pike County Correctional Facility 1114
Hall County Department of Corrections 916
Northern Oregon Correctional Facility 862
Eloy Detention Center 496
Teller County Jail 484
South Texas ICE Processing Center 254
Port Isabel Service Processing Center 234
Adelanto ICE Processing Center - West 164
Calhoun County Correctional Center 152
Sherburne County Jail 150
Northwest Contract Detention Center 132
Bristol County Jail and House of Correction 130
Glades County Detention Center 126
Folkston ICE Processing Center 122
Otay Mesa Detention Facility 120
Stewart Detention Center 118
Montgomery Processing Center 116
LaSalle ICE Processing Center 112
Bergen County Jail 110
Krome Service Processing Center 80
Aurora ICE Processing Center 66
Aurora ICE Processing Center II - Annex 66
El Paso Service Processing Center 66
Jena LaSalle Detention Facility 66
Mesa Verde ICE Processing Facility 60
Baker County Detention Center 58
Wakulla County Detention Facility 54
River Correctional Center 50
McHenry County Adult Correctional Facility 46
Irwin County Detention Center 42
Limestone County Detention Center 40
Pine Prairie ICE Processing Center 40
Prairieland Detention Center 40
Imperial Regional Detention Facility 38
Winn Correctional Center 36
Strafford County Corrections 33
Bluebonnet Detention Center 32
Donald W. Wyatt Detention Center 28
Johnson County Corrections Center 28
Adelanto ICE Processing Center - East 26
Caroline Detention Facility 26
Jackson Parish Correctional Center 26
Okmulgee County Jail - Moore Detention Facility 24
Morrow County Correctional Facility 22
Pulaski County Detention Center 22
Catahoula Correctional Center 20
Polk County Adult Detention Center 20
Otero County Processing Center 18
Yuba County Jail 18
CCA Florence Correctional Center 16
Plymouth County Correctional Facility 16
Shawnee County Department of Corrections - Adult Detention Center 16
Torrance County Detention Facility 16
Butler County Jail 14
Dodge County Detention Facility 14
Houston CDF 14
Orange County Jail 14
Adams County Correctional Center 12
Eden Detention Center 12
Elizabeth Contract Detention Facility 12
Tulsa County Jail - David L. Moss Criminal Jutice Center 12
Webb County Detention Center 12
Bossier Parish Corrections Center 10
Houston Contract Detention Facility 10
Boone County Jail 8
Broward Transitional Center 8
Clinton County Correctional Facility 8
Joe Corley Detention Facility 8
Nye County Detention Center 6
Richwood Correctional Center 6
Val Verde Correctional Facility 6
Folkston ICE Processing Center Annex 4
Hardin County Jail 4
Henderson Detention Center 4
Joe Corley Processing Center 4
Morgan County Adult Detention Center 4
Seneca County Jail 4
South Louisiana ICE Processing Center 4
Allen Parish Public Safety Complex 2
El Valle Detention Facility 2
Florence SPC 2
Freeborn County Adult Detention Center 2
Geauga County Jail 2
Howard County Detention Center 2
Kay County Detention Center 2
Rolling Plains Detention Center 2
Cass County Jail 1
Alamance County Detention Center 0
Brooks County Detention Center 0
Carver County Jail 0
Christian County Jail 0
Cibola County Correctional Center 0
Clay County Justice Center 0
Coastal Bend Detention Center 0
David L. Moss Criminal Justice Center 0
Douglas County Department of Corrections 0
East Hidalgo Detention Center 0
Golden State Annex 0
Jerome Combs Detention Center 0
Laredo Processing Center 0
LaSalle Correctional Center 0
LaSalle County Regional Detention Center 0
Monroe County Inmate Dormitory 0
Montgomery County Jail 0
Platte County Detention Center 0
Rio Grande Processing Center 0
Robert A. Deyton Detention Facility 0
Saint Clair County Jail 0
San Luis Regional Detention Center 0
Washoe County Detention Center 0
Webb County Detention Facility 0
West Texas Detention Facility 0
Western Tennessee Detention Facility 0
Willacy County Regional Detention Facility 0

5.2 Facet Plot of Use of Force by Facility

# Generating a linetype vector for use in the plot
plot_lines <- c(
    "solid",
    "solid",
    "solid",
    "solid",
    "solid",
    "solid",
    "solid",
    "dotted"
    )

# Use Color Brewer to set colors and modify
# the last color to be black for totals.
plot_colors <- brewer.pal(8, "Paired")
plot_colors[8] <- "#000000"

# Create plot labels
plot_labels <- c(
    "Immediate Use of Force Incidents",
    "Calculated Use of Force Incidents",
    "Uses of Force with Chemical Agents",
    "Incidents Where Non-Lethal Weapons Were Used",
    "Times 4/5 Point Restraints Used",
    "Use of Force With Serious Injury",
    "Strip Searches",
    "Total Disciplinary")

df_force %>% 
  
  # Calling the plot and formatting
  ggplot(aes(x=date, y = use_of_force_count, linetype=use_of_force_type))+
  geom_line(aes(color = use_of_force_type), size = .65) +
  
  # setting the linetype
  scale_linetype_manual(
    values = plot_lines,
    labels = plot_labels,
    name = "Use of Force Type:",
    guide = guide_legend(nrow = 8)
    )+
  
  # Setting the color
  scale_color_manual(
  values = plot_colors,
  labels = plot_labels,
  name = "Use of Force Type:",
  )+

  labs(title = "Disciplinary")+
  ylab("Number of Disciplinary Infractions")+
  xlab("Date")+
  theme(
    strip.text = element_text(size = 8),
    legend.position = "bottom"
    )+

    # Set the legend to multiple rows
  guides(col = guide_legend(nrow =8))+
  
  # Wrap
  facet_wrap(~ facility, ncol=3)

6 Sexual Abuse and Assault

6.1 Allegations

6.1.1 Summary Tables

df_sex_alleg <- df_324_inc %>%
  
  # Subset the df to only the used cols
  select(id, facility, date,
       sexual_abuse_allegations_detainee_on_detainee:
       sexual_abuse_allegations_detainee_on_staff_contractor_volunteer_29
       ) %>% 
  
  # Need the rowwise function to compute a row-at-a-time
  # in the following mutate function
  rowwise(id) %>% 
  
  # Create a new total column
  mutate(total_sexual_abuse_allegations = sum(c_across(
       sexual_abuse_allegations_detainee_on_detainee:
       sexual_abuse_allegations_detainee_on_staff_contractor_volunteer_29
  ))) %>% 

  # Call a range of table columns and pivot long
  pivot_longer(.,
               cols=  sexual_abuse_allegations_detainee_on_detainee:total_sexual_abuse_allegations,
               names_to = "sexual_abuse_allegations_type",
               values_to = "sexual_abuse_allegations_count") %>%
  
  # Remove NA
  drop_na() %>% 
  
  # Explicitly define factor levels
  mutate(sexual_abuse_allegations_type = factor(sexual_abuse_allegations_type, levels = c(
    "sexual_abuse_allegations_detainee_on_detainee",
    "sexual_abuse_allegations_inmate_on_detainee",
    "sexual_abuse_allegations_detainee_on_inmate",
    "sexual_abuse_allegations_detainee_on_staff_contractor_volunteer",
    "sexual_abuse_allegations_detainee_on_staff_contractor_volunteer_29",
    "total_sexual_abuse_allegations"
  )))
df_sex_alleg %>% 
  group_by(sexual_abuse_allegations_type) %>% 
  summarise(`Sexual Abuse and Assault Allegations by Type` = sum(sexual_abuse_allegations_count)) %>% 
  ungroup() %>% 
  kable(caption = "Total Sexual Abuse and Assault Allegations by Type",
        col.names = c("Allegation Type", "Total Allegation Type")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive"))
Table 6.1: Total Sexual Abuse and Assault Allegations by Type
Allegation Type Total Allegation Type
sexual_abuse_allegations_detainee_on_detainee 482
sexual_abuse_allegations_inmate_on_detainee 24
sexual_abuse_allegations_detainee_on_inmate 12
sexual_abuse_allegations_detainee_on_staff_contractor_volunteer 175
sexual_abuse_allegations_detainee_on_staff_contractor_volunteer_29 16
total_sexual_abuse_allegations 707
df_sex_alleg %>% 
  group_by(facility) %>% 
  summarise(total_sexual_abuse_allegations = sum(sexual_abuse_allegations_count)) %>% 
  arrange(desc(total_sexual_abuse_allegations)) %>% 
  ungroup() %>% 
  kable(caption = "Total Sexual Abuse and Assault Allegations by Facility",
        col.names = c("Facility", "Total Allegations by Facility")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive")) %>% 
  scroll_box(height = "300px")
Table 6.1: Total Sexual Abuse and Assault Allegations by Facility
Facility Total Allegations by Facility
Otay Mesa Detention Facility 160
Eloy Detention Center 122
Adelanto ICE Processing Center - West 102
Krome Service Processing Center 70
El Paso Service Processing Center 66
York County Prison 58
Montgomery Processing Center 44
South Texas ICE Processing Center 44
Western Tennessee Detention Facility 36
Imperial Regional Detention Facility 32
Northwest Contract Detention Center 32
Essex County Corrections Facility 24
Irwin County Detention Center 24
Adelanto ICE Processing Center - East 22
Bluebonnet Detention Center 22
Jackson Parish Correctional Center 22
LaSalle ICE Processing Center 22
Otero County Processing Center 22
Folkston ICE Processing Center 20
Clinton County Correctional Facility 18
Dodge County Detention Facility 18
Yuba County Jail 18
Aurora ICE Processing Center 16
Aurora ICE Processing Center II - Annex 16
CCA Florence Correctional Center 16
Hardin County Jail 16
Port Isabel Service Processing Center 16
Webb County Detention Facility 16
Glades County Detention Center 14
Jena LaSalle Detention Facility 14
Okmulgee County Jail - Moore Detention Facility 14
Eden Detention Center 12
Houston CDF 12
La Palma Correctional Center 12
Mesa Verde ICE Processing Facility 12
Prairieland Detention Center 12
Winn Correctional Center 12
Caroline Detention Facility 10
Stewart Detention Center 10
Broward Transitional Center 8
Calhoun County Correctional Center 8
Geauga County Jail 8
Limestone County Detention Center 8
Sherburne County Jail 8
Strafford County Corrections 8
Bergen County Jail 6
Joe Corley Processing Center 6
Northern Oregon Correctional Facility 6
Torrance County Detention Facility 6
Webb County Detention Center 6
Adams County Correctional Center 4
Baker County Detention Center 4
Bristol County Jail and House of Correction 4
El Valle Detention Facility 4
Florence SPC 4
Folkston ICE Processing Center Annex 4
Hall County Department of Corrections 4
Henderson Detention Center 4
Laredo Processing Center 4
McHenry County Adult Correctional Facility 4
Morgan County Adult Detention Center 4
Pine Prairie ICE Processing Center 4
Plymouth County Correctional Facility 4
Rio Grande Processing Center 4
River Correctional Center 4
Seneca County Jail 4
Tulsa County Jail - David L. Moss Criminal Jutice Center 4
Val Verde Correctional Facility 4
Wakulla County Detention Facility 4
Bossier Parish Corrections Center 2
Cass County Jail 2
Cibola County Correctional Center 2
Elizabeth Contract Detention Facility 2
Farmville Detention Center 2
Joe Corley Detention Facility 2
Kay County Detention Center 2
Monroe County Inmate Dormitory 2
Montgomery County Jail 2
Nye County Detention Center 2
Richwood Correctional Center 2
Rolling Plains Detention Center 2
Shawnee County Department of Corrections - Adult Detention Center 2
Sheriff Al Cannon Detention Center 2
South Louisiana ICE Processing Center 2
West Texas Detention Facility 2
Worcester County Jail 2
Alamance County Detention Center 0
Allen Parish Public Safety Complex 0
Boone County Jail 0
Brooks County Detention Center 0
Butler County Jail 0
Cambria County Prison 0
Carver County Jail 0
Catahoula Correctional Center 0
Christian County Jail 0
Clay County Justice Center 0
Coastal Bend Detention Center 0
David L. Moss Criminal Justice Center 0
Donald W. Wyatt Detention Center 0
Douglas County Department of Corrections 0
East Hidalgo Detention Center 0
Essex County Correctional Facility 0
Freeborn County Adult Detention Center 0
Golden State Annex 0
Houston Contract Detention Facility 0
Howard County Detention Center 0
Hudson County Corrections and Rehabilitation Center 0
Jerome Combs Detention Center 0
Johnson County Corrections Center 0
LaSalle Correctional Center 0
LaSalle County Regional Detention Center 0
Morrow County Correctional Facility 0
Orange County Jail 0
Pike County Correctional Facility 0
Platte County Detention Center 0
Polk County Adult Detention Center 0
Pulaski County Detention Center 0
Robert A. Deyton Detention Facility 0
Saint Clair County Jail 0
San Luis Regional Detention Center 0
Teller County Jail 0
Washoe County Detention Center 0
Willacy County Regional Detention Facility 0

6.1.2 Facet Plot of Sexual Abuse and Assault Allegations by Facility

# Generating a linetype vector for use in the plot
plot_lines <- c(
    "solid",
    "solid",
    "solid",
    "solid",
    "solid",
    "dotted"
    )

# Use Color Brewer to set colors and modify
# the last color to be black for totals.
plot_colors <- brewer.pal(6, "Paired")
plot_colors[6] <- "#000000"

# Create plot labels
plot_labels <- c(
    "Sexual Abuse Allegations - Detainee on Detainee",
    "Sexual Abuse Allegations - Inmate on Detainee",
    "Sexual Abuse Allegations - Detainee on Inmate",
    "Sexual Abuse Allegations - Staff/Contractor/Volunteer on Detainee",
    "Number of Sexual Abuse Allegations - Detainee on Staff/Contractor/Volunteer",
    "Total Sexual Abuse Allegations")

df_sex_alleg %>% 
  # Calling the plot and formatting
  ggplot(aes(x=date, y = sexual_abuse_allegations_count, linetype=sexual_abuse_allegations_type))+
  geom_line(aes(color = sexual_abuse_allegations_type),size=.65) +
  
  # Set the linetype
  scale_linetype_manual(
    values = plot_lines,
    labels = plot_labels,
    name = "Sexual Abuse Allegation Type:",
    guide = guide_legend(nrow = 6)
    )+
  
  # Set the color
  scale_color_manual(values = plot_colors,
                     labels = plot_labels,
                     name = "Sexual Abuse Allegation Type:")+

  labs(title = "Sexual Abuse Allegations")+
  ylab("Number of Allegations")+
  xlab("Date")+
  theme(
    strip.text = element_text(size = 8),
    legend.position = "bottom"
    )+

    # Set the legend to multiple rows
  guides(col = guide_legend(nrow =8))+
  
  # Wrap
  facet_wrap(~ facility, ncol=3)

6.2 Substantiated Allegations

6.2.1 Summary Tables

df_sex_alleg_sub <- df_324_inc %>%
  
  # Subset the df to only the used cols
  select(id, facility, date,
       sexual_abuse_allegations_detainee_on_detainee_2:
       sexual_abuse_allegations_detainee_on_staff_contractor_volunteer_34
       ) %>% 
  
  # Need the rowwise function to compute a row-at-a-time
  # in the following mutate function
  rowwise(id) %>% 
  
  # Create a new total column
  mutate(total_sexual_abuse_allegations = sum(c_across(
       sexual_abuse_allegations_detainee_on_detainee_2:
       sexual_abuse_allegations_detainee_on_staff_contractor_volunteer_34
  ))) %>% 

  # Call a range of table columns and pivot long
  pivot_longer(.,
               cols=  sexual_abuse_allegations_detainee_on_detainee_2:total_sexual_abuse_allegations,
               names_to = "sexual_abuse_substantiated_type",
               values_to = "sexual_abuse_substantiated_count") %>%
  
  # Remove NA values
  drop_na() %>% 
  
  # Explicitly set factor levels
  mutate(sexual_abuse_substantiated_type= factor(sexual_abuse_substantiated_type, levels =c(
    "sexual_abuse_allegations_detainee_on_detainee_2",
    "sexual_abuse_allegations_inmate_on_detainee_2",
    "sexual_abuse_allegations_detainee_on_inmate_2",
    "sexual_abuse_allegations_staff_contractor_volunteer_on_detainee",
    "sexual_abuse_allegations_detainee_on_staff_contractor_volunteer_34",
    "total_sexual_abuse_allegations"
  )))
df_sex_alleg_sub %>% 
  group_by(sexual_abuse_substantiated_type) %>% 
  summarise(`Sexual Abuse and Assault Allegations Substantiated by Type` = sum(sexual_abuse_substantiated_count)) %>% 
  ungroup() %>% 
  kable(caption = "Total Substantiated Sexual Abuse and Assault Allegations by Type",
        col.names = c("Substantiated Allegation Type", "Total Substantiated Allegation Type")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive"))
Table 6.2: Total Substantiated Sexual Abuse and Assault Allegations by Type
Substantiated Allegation Type Total Substantiated Allegation Type
sexual_abuse_allegations_detainee_on_detainee_2 80
sexual_abuse_allegations_inmate_on_detainee_2 10
sexual_abuse_allegations_detainee_on_inmate_2 2
sexual_abuse_allegations_staff_contractor_volunteer_on_detainee 6
sexual_abuse_allegations_detainee_on_staff_contractor_volunteer_34 0
total_sexual_abuse_allegations 98
df_sex_alleg_sub %>% 
  group_by(facility) %>% 
  summarise(total_sexual_abuse_substantiated = sum(sexual_abuse_substantiated_count)) %>% 
  arrange(desc(total_sexual_abuse_substantiated)) %>% 
  ungroup() %>% 
  kable(caption = "Total Substantiated Sexual Abuse and Assault Allegations by Facility",
        col.names = c("Facility", "Total Substantiated Allegations by Facility")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive")) %>% 
  scroll_box(height = "300px")
Table 6.2: Total Substantiated Sexual Abuse and Assault Allegations by Facility
Facility Total Substantiated Allegations by Facility
Otay Mesa Detention Facility 40
Eloy Detention Center 34
Krome Service Processing Center 26
York County Prison 18
Geauga County Jail 8
Folkston ICE Processing Center 6
Irwin County Detention Center 6
Webb County Detention Facility 6
CCA Florence Correctional Center 4
Morgan County Adult Detention Center 4
Otero County Processing Center 4
Stewart Detention Center 4
Yuba County Jail 4
Bergen County Jail 2
Bluebonnet Detention Center 2
Dodge County Detention Facility 2
El Paso Service Processing Center 2
El Valle Detention Facility 2
Essex County Corrections Facility 2
Hardin County Jail 2
Joe Corley Detention Facility 2
La Palma Correctional Center 2
LaSalle ICE Processing Center 2
Mesa Verde ICE Processing Facility 2
Monroe County Inmate Dormitory 2
Northern Oregon Correctional Facility 2
Okmulgee County Jail - Moore Detention Facility 2
Torrance County Detention Facility 2
Winn Correctional Center 2
Adams County Correctional Center 0
Adelanto ICE Processing Center - East 0
Adelanto ICE Processing Center - West 0
Alamance County Detention Center 0
Allen Parish Public Safety Complex 0
Aurora ICE Processing Center 0
Aurora ICE Processing Center II - Annex 0
Baker County Detention Center 0
Boone County Jail 0
Bossier Parish Corrections Center 0
Bristol County Jail and House of Correction 0
Brooks County Detention Center 0
Broward Transitional Center 0
Butler County Jail 0
Calhoun County Correctional Center 0
Cambria County Prison 0
Caroline Detention Facility 0
Carver County Jail 0
Cass County Jail 0
Catahoula Correctional Center 0
Christian County Jail 0
Cibola County Correctional Center 0
Clay County Justice Center 0
Clinton County Correctional Facility 0
Coastal Bend Detention Center 0
David L. Moss Criminal Justice Center 0
Donald W. Wyatt Detention Center 0
Douglas County Department of Corrections 0
East Hidalgo Detention Center 0
Eden Detention Center 0
Elizabeth Contract Detention Facility 0
Essex County Correctional Facility 0
Farmville Detention Center 0
Florence SPC 0
Folkston ICE Processing Center Annex 0
Freeborn County Adult Detention Center 0
Glades County Detention Center 0
Golden State Annex 0
Hall County Department of Corrections 0
Henderson Detention Center 0
Houston CDF 0
Houston Contract Detention Facility 0
Howard County Detention Center 0
Hudson County Corrections and Rehabilitation Center 0
Imperial Regional Detention Facility 0
Jackson Parish Correctional Center 0
Jena LaSalle Detention Facility 0
Jerome Combs Detention Center 0
Joe Corley Processing Center 0
Johnson County Corrections Center 0
Kay County Detention Center 0
Laredo Processing Center 0
LaSalle Correctional Center 0
LaSalle County Regional Detention Center 0
Limestone County Detention Center 0
McHenry County Adult Correctional Facility 0
Montgomery County Jail 0
Montgomery Processing Center 0
Morrow County Correctional Facility 0
Northwest Contract Detention Center 0
Nye County Detention Center 0
Orange County Jail 0
Pike County Correctional Facility 0
Pine Prairie ICE Processing Center 0
Platte County Detention Center 0
Plymouth County Correctional Facility 0
Polk County Adult Detention Center 0
Port Isabel Service Processing Center 0
Prairieland Detention Center 0
Pulaski County Detention Center 0
Richwood Correctional Center 0
Rio Grande Processing Center 0
River Correctional Center 0
Robert A. Deyton Detention Facility 0
Rolling Plains Detention Center 0
Saint Clair County Jail 0
San Luis Regional Detention Center 0
Seneca County Jail 0
Shawnee County Department of Corrections - Adult Detention Center 0
Sherburne County Jail 0
Sheriff Al Cannon Detention Center 0
South Louisiana ICE Processing Center 0
South Texas ICE Processing Center 0
Strafford County Corrections 0
Teller County Jail 0
Tulsa County Jail - David L. Moss Criminal Jutice Center 0
Val Verde Correctional Facility 0
Wakulla County Detention Facility 0
Washoe County Detention Center 0
Webb County Detention Center 0
West Texas Detention Facility 0
Western Tennessee Detention Facility 0
Willacy County Regional Detention Facility 0

6.2.2 Facet Plot of Substantiated Sexual Abuse and Assault Allegations

# Generating a linetype vector for use in the plot
plot_lines <- c(
    "solid",
    "solid",
    "solid",
    "solid",
    "solid",
    "dotted"
    )

# Use Color Brewer to set colors and modify
# the last color to be black for totals.
plot_colors <- brewer.pal(6, "Paired")
plot_colors[6] <- "#000000"

# Create the labels
plot_labels <- c(
    "Sexual Abuse Allegations - Detainee on Detainee",
    "Sexual Abuse Allegations - Inmate on Detainee",
    "Sexual Abuse Allegations - Detainee on Inmate",
    "Sexual Abuse Allegations - Staff/Contractor/Volunteer on Detainee",
    "Number of Sexual Abuse Allegations - Detainee on Staff/Contractor/Volunteer",
    "Total Sexual Abuse Allegations")

df_sex_alleg_sub %>% 
  
  # Calling the plot and formatting
  ggplot(aes(x=date, y = sexual_abuse_substantiated_count, linetype=sexual_abuse_substantiated_type))+
  geom_line(aes(color = sexual_abuse_substantiated_type),size=.65) +
  
  # Set the linetype
  scale_linetype_manual(
    values = plot_lines,
    labels = plot_labels,
    name = "Sexual Abuse Allegation Type:",
    guide = guide_legend(nrow = 6)
    )+
  
  # Set the color
  scale_color_manual(values = plot_colors,
                     labels = plot_labels,
                     name = "Sexual Abuse Allegation Type:")+

  labs(title = "Sexual Abuse Allegations Substantiated")+
  ylab("Number of Allegations")+
  xlab("Date")+
  theme(
    strip.text = element_text(size = 8),
    legend.position = "bottom"
    )+

  # Set the legend to multiple rows
  guides(col = guide_legend(nrow =8))+
  
  # Wrap
  facet_wrap(~ facility, ncol=3)

7 Medical

7.1 Medical Observation

# Generating a linetype vector for use in the plot
plot_lines <- c(
    "solid",
    "solid",
    "dotted"
    )

# Use Color Brewer to set colors
plot_colors <- brewer.pal(3, "Paired")
plot_colors[3] <- "#000000"

# Create plot labels
plot_labels <- c(
    "Detainees in Medical Observation",
    "Detainees in Mental Health Observation",
    "Total Individuals in Medical or Mental Health Observation")

df_324_inc %>%
  
  # Subset the df to only the used cols
  select(id, facility, date,
       detainees_in_medical_observation:
       detainees_in_mental_health_observation
       ) %>% 
  
  # Need the rowwise function to compute a row-at-a-time
  # in the following mutate function
  rowwise(id) %>% 
  
  # Create a new total column
  mutate(total_mental_medical_observation = sum(c_across(
       detainees_in_medical_observation:
       detainees_in_mental_health_observation
  ))) %>% 

  # Call a range of table columns and pivot long
  pivot_longer(.,
               cols=  detainees_in_medical_observation:total_mental_medical_observation,
               names_to = "medical_mental_observation_type",
               values_to = "medical_mental_observation_count") %>%
  
  # Remove NA values
  drop_na() %>% 
  
  # Explicitly set factor levels
  mutate(medical_mental_observation_type = factor(medical_mental_observation_type, levels = c(
    "detainees_in_medical_observation",
    "detainees_in_mental_health_observation",
    "total_mental_medical_observation"
  ))) %>% 
  
  # Calling the plot and formatting
  ggplot(aes(x=date, y = medical_mental_observation_count, linetype=medical_mental_observation_type))+
  geom_line(aes(color = medical_mental_observation_type),size=.65) +
  
  # Set the linetype
  scale_linetype_manual(
    values = plot_lines,
    labels = plot_labels,
    name = "Observation Type:",
    guide = guide_legend(nrow = 3)
    )+
  
  # Set the color
  scale_color_manual(values = plot_colors,
                     labels = plot_labels,
                     name = "Observation Type:",)+

  labs(title = "Medical and Mental Health Observation")+
  ylab("Number of Individuals in Observation")+
  xlab("Date")+
  theme(
    strip.text = element_text(size = 8),
    legend.position = "bottom"
    )+

  # Set the legend to multiple rows
  guides(col = guide_legend(nrow =3))+
  
  # Wrap
  facet_wrap(~ facility, ncol=3)

7.2 Infections Disease

# Generating a linetype vector for use in the plot
plot_lines <- c(
    "solid",
    "solid"
    )

# Use Color Brewer to set colors
plot_colors <- brewer.pal(2, "Paired")

# Create plot labels
plot_labels <- c(
    "Infectious Disease Reported",
    "Infectious Disease Confirmed")

df_324_inc %>%
  
  # Subset the df to only the used cols
  select(id, facility, date,
       infectious_disease_reported:
       infections_disease_confirmed
       ) %>% 
  
  # Need the rowwise function to compute a row-at-a-time
  # in the following mutate function
  rowwise(id) %>% 
  
  # # Create a new total column
  # # In this case not used
  # mutate(total_infections_disease_report_confirmed = sum(c_across(
  #      infectious_disease_reported:
  #      infections_disease_confirmed
  # ))) %>% 

  # Call a range of table columns and pivot long
  pivot_longer(.,
               cols=  infectious_disease_reported:infections_disease_confirmed,
               names_to = "infectious_disease_type",
               values_to = "infectious_disease_count") %>%
  
  # Remove NA values
  drop_na() %>% 
  
  # Explicitly define factor levels
  mutate(infectious_disease_type = factor(infectious_disease_type, levels = c(
    "infectious_disease_reported",
    "infections_disease_confirmed"
  ))) %>% 
  
  # Calling the plot and formatting
  ggplot(aes(x=date, y = infectious_disease_count, linetype=infectious_disease_type))+
  geom_line(aes(color = infectious_disease_type),size=.65) +
  
  # Set the linetype
  scale_linetype_manual(
    values = plot_lines,
    labels = plot_labels,
    name = "Category:",
    guide = guide_legend(nrow = 2)
    )+
  
  # Set the color
  scale_color_manual(values = plot_colors,
    labels = plot_labels,
    name = "Category:")+

  labs(title = "Infectious Diseases Reported and Confirmed")+
  ylab("Count")+
  xlab("Date")+
  theme(
    strip.text = element_text(size = 8),
    legend.position = "bottom"
    )+

  # Set the legend to multiple rows
  guides(col = guide_legend(nrow =3))+
  
  # Wrap
  facet_wrap(~ facility, ncol=3)

7.3 Medical and Mental Health Referrals

# Generating a linetype vector for use in the plot
plot_lines <- c(
    "solid",
    "solid",
    "solid",
    "solid",
    "dotted"
    )

# Use Color Brewer to set colors
plot_colors <- brewer.pal(5, "Paired")
plot_colors[5] <- "#000000"

# Create plot labels
plot_labels <- c(
    "Outside Medical Referrals",
    "Detainees Transported to Off-Site Hospitals for Emergency Reasons",
    "Admissions to Off-Site Hospitals for Medical Reasons",
    "Admissions to Off-Site Hospitals for Mental Health Reasons",
    "Total Referrals")


df_324_inc %>%
  
  # Subset the df to only the used cols
  select(id, facility, date,
       outside_medical_referrals:
       admissions_to_off_site_hospitals_for_mental_health_reasons
       ) %>% 
  
  # Need the rowwise function to compute a row-at-a-time
  # in the following mutate function
  rowwise(id) %>% 
  
  # Create a new total column
  mutate(total_referrals = sum(c_across(
       outside_medical_referrals:
       admissions_to_off_site_hospitals_for_mental_health_reasons
  ))) %>% 

  # Call a range of table columns and pivot long
  pivot_longer(.,
               cols=  outside_medical_referrals:total_referrals,
               names_to = "referral_type",
               values_to = "referral_count") %>%
  
  # Remove NA values
  drop_na() %>% 
  
  # Explicitly define factor levels
  mutate(referral_type= factor(referral_type, levels = c(
    "outside_medical_referrals",
    "detainees_transported_to_off_site_hospitals_for_emergency_care",
    "admissions_to_off_site_hospitals_for_medical_reasons",
    "admissions_to_off_site_hospitals_for_mental_health_reasons",
    "total_referrals"
  ))) %>% 
  
  
  # Calling the plot and formatting
  ggplot(aes(x=date, y = referral_count, linetype=referral_type))+
  geom_line(aes(color = referral_type),size=.65) +
  
  # Set the linetype
  scale_linetype_manual(
    values = plot_lines,
    labels = plot_labels,
    name = "Referral Type:",
    guide = guide_legend(nrow = 5)
    )+
  
  # Set the color
  scale_color_manual(values = plot_colors,
    labels = plot_labels,
    name = "Referral Type:")+

  labs(title = "Medical and Mental Health Referrals")+
  ylab("Number of Referrals")+
  xlab("Date")+
  theme(
    strip.text = element_text(size = 8),
    legend.position = "bottom"
    )+

  # Set the legend to multiple rows
  guides(col = guide_legend(nrow =5))+
  
  # Wrap
  facet_wrap(~ facility, ncol=3)

7.4 Sick Call Requests and Encounters

df_sick_call <- df_324_inc %>%
  
  # Select a subset of columns to work with
  select(id,
         facility,
         date,
         sick_call_requests,
         sick_call_encounters) %>% 
  
  # Need the rowwise function to compute a row-at-a-time
  # in the following mutate function
  rowwise(id) %>% 
  
  # Create new total column
  mutate(total_sick_call = sick_call_requests,
         sick_call_encounters) %>% 
  
  # Tidy
  pivot_longer(.,
               cols= sick_call_requests:
         sick_call_encounters,
               names_to = "sick_call_type",
               values_to = "sick_call_count") %>% 
  
  # Remove NA
  drop_na() %>% 
  
  # Explicitly set factor levels
  mutate(sick_call_type = factor(sick_call_type, levels = c(
    "sick_call_requests",
    "sick_call_encounters",
    "total_sick_call"
  )))
df_sick_call %>% 
  group_by(sick_call_type) %>% 
  summarise(`Total Sick Call by Type` = sum(sick_call_count)) %>% 
  ungroup() %>% 
  kable(caption = "Total Sick Call by Type",
        col.names = c("Type", "Total")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive"))
Table 7.1: Total Sick Call by Type
Type Total
sick_call_requests 617349
sick_call_encounters 607870
df_sick_call %>% 
  group_by(facility) %>% 
  summarise(total_sick_call = sum(sick_call_count)) %>% 
  arrange(desc(total_sick_call)) %>% 
  ungroup() %>% 
  kable(caption = "Total Sick Call Requests/Encounters by Facility",
        col.names = c("Facility", "Total")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive")) %>% 
  scroll_box(height = "300px")
Table 7.1: Total Sick Call Requests/Encounters by Facility
Facility Total
Adelanto ICE Processing Center - East 66777
Adelanto ICE Processing Center - West 66777
Port Isabel Service Processing Center 59808
South Texas ICE Processing Center 48814
Montgomery Processing Center 44111
Rio Grande Processing Center 44102
Otay Mesa Detention Facility 42973
Eloy Detention Center 39798
Prairieland Detention Center 36952
Otero County Processing Center 30388
Imperial Regional Detention Facility 30196
Broward Transitional Center 30028
Polk County Adult Detention Center 29048
El Paso Service Processing Center 28326
Henderson Detention Center 27056
Jackson Parish Correctional Center 26363
River Correctional Center 25976
Irwin County Detention Center 23626
Aurora ICE Processing Center 23178
Aurora ICE Processing Center II - Annex 23178
Krome Service Processing Center 23057
Essex County Corrections Facility 21902
Stewart Detention Center 20457
El Valle Detention Facility 19821
Winn Correctional Center 19786
Houston CDF 17439
LaSalle ICE Processing Center 16400
La Palma Correctional Center 16032
Adams County Correctional Center 16025
Farmville Detention Center 15811
York County Prison 14910
Jena LaSalle Detention Facility 14429
Webb County Detention Center 13191
Bossier Parish Corrections Center 12884
Elizabeth Contract Detention Facility 11870
Catahoula Correctional Center 11612
Sherburne County Jail 11064
Joe Corley Detention Facility 10367
Mesa Verde ICE Processing Facility 10336
Folkston ICE Processing Center 9572
McHenry County Adult Correctional Facility 9245
Calhoun County Correctional Center 9010
Webb County Detention Facility 8494
Florence SPC 8363
Laredo Processing Center 8351
Pine Prairie ICE Processing Center 7906
Torrance County Detention Facility 7766
South Louisiana ICE Processing Center 7608
Houston Contract Detention Facility 6421
Joe Corley Processing Center 6389
Bluebonnet Detention Center 6309
Caroline Detention Facility 5244
Richwood Correctional Center 4210
Orange County Jail 3948
Hudson County Corrections and Rehabilitation Center 3941
Folkston ICE Processing Center Annex 3778
Donald W. Wyatt Detention Center 3738
Johnson County Corrections Center 3628
Okmulgee County Jail - Moore Detention Facility 3524
Yuba County Jail 3432
Geauga County Jail 3299
Baker County Detention Center 3263
Wakulla County Detention Facility 3161
Allen Parish Public Safety Complex 3052
Pike County Correctional Facility 2964
CCA Florence Correctional Center 2830
Pulaski County Detention Center 2644
Clinton County Correctional Facility 2416
Limestone County Detention Center 2334
Tulsa County Jail - David L. Moss Criminal Jutice Center 2174
Kay County Detention Center 2026
Bristol County Jail and House of Correction 2006
Carver County Jail 1940
Hardin County Jail 1688
Butler County Jail 1174
Clay County Justice Center 1115
Worcester County Jail 1060
Bergen County Jail 986
Jerome Combs Detention Center 908
Morgan County Adult Detention Center 876
Cambria County Prison 742
Montgomery County Jail 658
Val Verde Correctional Facility 649
LaSalle Correctional Center 546
Howard County Detention Center 526
Strafford County Corrections 507
Freeborn County Adult Detention Center 472
Rolling Plains Detention Center 456
Northern Oregon Correctional Facility 414
Alamance County Detention Center 360
West Texas Detention Facility 334
Saint Clair County Jail 320
Coastal Bend Detention Center 296
Cibola County Correctional Center 259
Morrow County Correctional Facility 184
Teller County Jail 164
Platte County Detention Center 156
Golden State Annex 140
Shawnee County Department of Corrections - Adult Detention Center 132
Seneca County Jail 105
LaSalle County Regional Detention Center 62
Christian County Jail 24
Brooks County Detention Center 21
San Luis Regional Detention Center 17
Washoe County Detention Center 14
David L. Moss Criminal Justice Center 0
East Hidalgo Detention Center 0
Eden Detention Center 0
Nye County Detention Center 0
Robert A. Deyton Detention Facility 0
Sheriff Al Cannon Detention Center 0
Western Tennessee Detention Facility 0
Willacy County Regional Detention Facility 0
# Generating a linetype vector for use in the plot
plot_lines <- c(
    "solid",
    "solid",
    "dotted"
    )

# Use Color Brewer to set colors
plot_colors <- brewer.pal(3, "Paired")
plot_colors[3] <- "#000000"

# Create labels
plot_labels <- c(
    "Sick Call Requests",
    "Sick Call Encounters",
    "Total Sick Calls")

df_324_inc %>%
  
  # Subset the df to only the used cols
  select(id, facility, date,
       sick_call_requests:
       sick_call_encounters
       ) %>% 
  
  # Need the rowwise function to compute a row-at-a-time
  # in the following mutate function
  rowwise(id) %>% 
  
  # Create a new total column
  mutate(total_sick_calls = sum(c_across(
       sick_call_requests:
       sick_call_encounters
  ))) %>% 

  # Call a range of table columns and pivot long
  pivot_longer(.,
               cols=  sick_call_requests:total_sick_calls,
               names_to = "sick_call_type",
               values_to = "sick_call_count") %>%
  
  # Remove NA values
  drop_na() %>% 
  
  # Explicitly define factor levels
  mutate(sick_call_type = factor(sick_call_type, levels = c(
    "sick_call_requests",
    "sick_call_encounters",
    "total_sick_calls"
  ))) %>% 
  
  # Calling the plot and formatting
  ggplot(aes(x=date, y = sick_call_count, linetype=sick_call_type))+
  geom_line(aes(color = sick_call_type),size=.65) +
  
  # Set the linetype
  scale_linetype_manual(
    values = plot_lines,
    labels = plot_labels,
    name = "Sick Call Type:",
    guide = guide_legend(nrow = 3)
    )+
  
  # Set the color
  scale_color_manual(values = plot_colors,
    labels = plot_labels,
    name = "Sick Call Type:")+

  labs(title = "Sick Calls")+
  ylab("Number of Sick Calls")+
  xlab("Date")+
  theme(
    strip.text = element_text(size = 8),
    legend.position = "bottom"
    )+

  # Set the legend to multiple rows
  guides(col = guide_legend(nrow =3))+
  
  # Wrap
  facet_wrap(~ facility, ncol=3)

7.5 Suicide Attempts and Watches

The following shows Suicide Attempts and Suicide Watches based on the status of the data as of 2021-06-24. The numbers are subject to change.

df_suicide <- df_324_inc %>%
  
  # Select a subset of columns to work with
  select(id,
         facility,
         date,
         suicide_attempts_or_self_harm,
         suicide_watches_constant_watch_mental_health_observation) %>% 
  
  # Need the rowwise function to compute a row-at-a-time
  # in the following mutate function
  rowwise(id) %>% 
  
  # Create new total column
  mutate(total_suicide = suicide_attempts_or_self_harm +
         suicide_watches_constant_watch_mental_health_observation) %>% 
  
  # Tidy
  pivot_longer(.,
               cols= suicide_attempts_or_self_harm:
               total_suicide,
               names_to = "suicide_type",
               values_to = "suicide_count") %>% 
  
  # Remove NA
  drop_na() %>% 
  
  # Explicitly set factor levels
  mutate(segregation_type = factor(suicide_type, levels = c(
    "suicide_attempts_or_self_harm",
    "suicide_watches_constant_watch_mental_health_observation",
    "total_suicide"
  )))
df_suicide %>% 
  group_by(suicide_type) %>% 
  summarise(`Total Suicide Attempt or Watch by Type` = sum(suicide_count)) %>% 
  ungroup() %>% 
  kable(caption = "Total Suicide Attempt or Watch by Type",
        col.names = c("Type", "Total")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive"))
Table 7.2: Total Suicide Attempt or Watch by Type
Type Total
suicide_attempts_or_self_harm 234
suicide_watches_constant_watch_mental_health_observation 4716
total_suicide 4948
df_suicide %>% 
  group_by(facility) %>% 
  summarise(total_suicide = sum(suicide_count)) %>% 
  arrange(desc(total_suicide)) %>% 
  ungroup() %>% 
  kable(caption = "Total Suicide Attempt or Watch by Facility",
        col.names = c("Facility", "Total")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive")) %>% 
  scroll_box(height = "300px")
Table 7.2: Total Suicide Attempt or Watch by Facility
Facility Total
Adelanto ICE Processing Center - East 878
Adelanto ICE Processing Center - West 878
Henderson Detention Center 750
Aurora ICE Processing Center 606
Aurora ICE Processing Center II - Annex 606
La Palma Correctional Center 402
Bristol County Jail and House of Correction 390
Port Isabel Service Processing Center 358
Otay Mesa Detention Facility 282
Eloy Detention Center 246
York County Prison 214
Stewart Detention Center 200
Otero County Processing Center 192
Montgomery Processing Center 182
Irwin County Detention Center 178
Prairieland Detention Center 158
South Texas ICE Processing Center 158
Imperial Regional Detention Facility 134
Pike County Correctional Facility 132
Folkston ICE Processing Center 122
Polk County Adult Detention Center 114
Essex County Corrections Facility 112
Bergen County Jail 108
Glades County Detention Center 102
LaSalle ICE Processing Center 102
Nye County Detention Center 102
River Correctional Center 92
Winn Correctional Center 92
El Valle Detention Facility 86
Farmville Detention Center 86
El Paso Service Processing Center 84
Krome Service Processing Center 74
Sherburne County Jail 74
Florence SPC 70
Jena LaSalle Detention Facility 68
Broward Transitional Center 64
Adams County Correctional Center 62
Caroline Detention Facility 60
Limestone County Detention Center 56
Carver County Jail 54
Mesa Verde ICE Processing Facility 52
Elizabeth Contract Detention Facility 50
Jackson Parish Correctional Center 46
Essex County Correctional Facility 44
Joe Corley Detention Facility 44
Plymouth County Correctional Facility 42
Pine Prairie ICE Processing Center 40
Webb County Detention Facility 40
CCA Florence Correctional Center 36
Houston CDF 36
Pulaski County Detention Center 34
Houston Contract Detention Facility 32
McHenry County Adult Correctional Facility 32
Strafford County Corrections 32
South Louisiana ICE Processing Center 30
Tulsa County Jail - David L. Moss Criminal Jutice Center 30
Folkston ICE Processing Center Annex 24
Hudson County Corrections and Rehabilitation Center 24
Yuba County Jail 24
Baker County Detention Center 22
Butler County Jail 22
Calhoun County Correctional Center 22
Rio Grande Processing Center 22
Torrance County Detention Facility 22
Worcester County Jail 22
Joe Corley Processing Center 20
Johnson County Corrections Center 20
Shawnee County Department of Corrections - Adult Detention Center 20
Bluebonnet Detention Center 18
Allen Parish Public Safety Complex 16
Catahoula Correctional Center 16
Clinton County Correctional Facility 16
Donald W. Wyatt Detention Center 14
Kay County Detention Center 14
Alamance County Detention Center 12
Boone County Jail 12
Orange County Jail 12
Val Verde Correctional Facility 12
Wakulla County Detention Facility 12
Bossier Parish Corrections Center 10
Howard County Detention Center 10
Okmulgee County Jail - Moore Detention Facility 10
Seneca County Jail 10
Dodge County Detention Facility 8
Geauga County Jail 8
Richwood Correctional Center 8
Robert A. Deyton Detention Facility 8
Webb County Detention Center 8
Coastal Bend Detention Center 6
Laredo Processing Center 6
San Luis Regional Detention Center 6
Sheriff Al Cannon Detention Center 6
Clay County Justice Center 4
Hardin County Jail 4
LaSalle Correctional Center 4
Morgan County Adult Detention Center 4
Cambria County Prison 2
Freeborn County Adult Detention Center 2
Hall County Department of Corrections 2
Jerome Combs Detention Center 2
Northern Oregon Correctional Facility 2
West Texas Detention Facility 2
Brooks County Detention Center 0
Cass County Jail 0
Christian County Jail 0
Cibola County Correctional Center 0
David L. Moss Criminal Justice Center 0
East Hidalgo Detention Center 0
Eden Detention Center 0
Golden State Annex 0
LaSalle County Regional Detention Center 0
Monroe County Inmate Dormitory 0
Montgomery County Jail 0
Morrow County Correctional Facility 0
Platte County Detention Center 0
Rolling Plains Detention Center 0
Saint Clair County Jail 0
Teller County Jail 0
Washoe County Detention Center 0
Western Tennessee Detention Facility 0
Willacy County Regional Detention Facility 0
# Use Color Brewer to set colors and modify
# the last color to be black for totals.
plot_colors <- brewer.pal(2, "Paired")

# Create plot labels
plot_labels <- c(
      "Suicide Attempts or Self Harm",
      "Suicide Watches/Constant Watch/Mental Health Observation")

df_324_inc %>%
  
  # Subset the df to only the used cols
  select(id, facility, date,
       suicide_attempts_or_self_harm,
       suicide_watches_constant_watch_mental_health_observation
       ) %>% 
  drop_na() %>% 
 
  # Call a range of table columns and pivot long
  pivot_longer(.,
               cols=  c(suicide_attempts_or_self_harm,
       suicide_watches_constant_watch_mental_health_observation),
               names_to = "suicide_type",
               values_to = "suicide_count") %>% 
  
  # Remove NA values
  drop_na() %>% 
  
  # Explicitly define factor levels
  mutate(suicide_type = factor(suicide_type, levels = c(
    "suicide_attempts_or_self_harm",
    "suicide_watches_constant_watch_mental_health_observation"
  ))) %>% 
  
  # Calling the plot and formatting
  ggplot(aes(x=date, y = suicide_count))+
  geom_line(aes(color=suicide_type), size = .65) +
  
  # Set the color
  scale_color_manual(
    values = plot_colors,
    labels = plot_labels,
    name = "Type:"
    )+
  
  labs(title = "Suicide Attempts and Watches")+
  ylab("Number of Attempts or Watches")+
  xlab("Date")+
  theme(
    strip.text = element_text(size = 5),
    legend.position = "bottom"
    )+
  # Set the legend to multiple rows
  guides(col = guide_legend(nrow =5))+
  
  # Wrap
  facet_wrap(~ facility, ncol = 3)

7.6 Hunger Strikes

df_324_inc %>%
  
  # Subset the df to only the used cols
  select(id, facility, date, hunger_strikes) %>% 

  group_by(facility) %>% 
  summarise(total_hunger_strike = sum(hunger_strikes)) %>% 
  arrange(desc(total_hunger_strike)) %>% 
  ungroup() %>% 
  kable(caption = "Total Hunger Strikes by Facility",
        col.names = c("Facility", "Total Hunger Strikes")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive")) %>% 
  scroll_box(height = "300px")
Table 7.3: Total Hunger Strikes by Facility
Facility Total Hunger Strikes
Bossier Parish Corrections Center 136
Krome Service Processing Center 71
La Palma Correctional Center 62
LaSalle ICE Processing Center 53
Otero County Processing Center 51
Jena LaSalle Detention Facility 49
Otay Mesa Detention Facility 48
Bristol County Jail and House of Correction 47
El Paso Service Processing Center 46
Pine Prairie ICE Processing Center 42
Port Isabel Service Processing Center 35
Adelanto ICE Processing Center - East 28
Adelanto ICE Processing Center - West 28
Montgomery Processing Center 18
Prairieland Detention Center 17
Irwin County Detention Center 14
Okmulgee County Jail - Moore Detention Facility 14
Johnson County Corrections Center 13
Imperial Regional Detention Facility 11
South Texas ICE Processing Center 11
Stewart Detention Center 11
Florence SPC 8
Butler County Jail 7
Teller County Jail 7
Farmville Detention Center 6
Houston Contract Detention Facility 6
Elizabeth Contract Detention Facility 5
Folkston ICE Processing Center 5
Plymouth County Correctional Facility 5
Sherburne County Jail 5
Torrance County Detention Facility 5
Cibola County Correctional Center 4
Tulsa County Jail - David L. Moss Criminal Jutice Center 4
Henderson Detention Center 3
Joe Corley Processing Center 3
York County Prison 3
Baker County Detention Center 2
McHenry County Adult Correctional Facility 2
Nye County Detention Center 2
Pike County Correctional Facility 2
Polk County Adult Detention Center 2
Wakulla County Detention Facility 2
Broward Transitional Center 1
Cambria County Prison 1
Caroline Detention Facility 1
Catahoula Correctional Center 1
CCA Florence Correctional Center 1
Clinton County Correctional Facility 1
El Valle Detention Facility 1
Houston CDF 1
Hudson County Corrections and Rehabilitation Center 1
Joe Corley Detention Facility 1
Northern Oregon Correctional Facility 1
San Luis Regional Detention Center 1
Alamance County Detention Center 0
Bergen County Jail 0
Brooks County Detention Center 0
Calhoun County Correctional Center 0
Carver County Jail 0
Cass County Jail 0
Christian County Jail 0
Clay County Justice Center 0
Coastal Bend Detention Center 0
David L. Moss Criminal Justice Center 0
Dodge County Detention Facility 0
Donald W. Wyatt Detention Center 0
Douglas County Department of Corrections 0
East Hidalgo Detention Center 0
Eden Detention Center 0
Essex County Correctional Facility 0
Essex County Corrections Facility 0
Folkston ICE Processing Center Annex 0
Glades County Detention Center 0
Golden State Annex 0
Hall County Department of Corrections 0
Hardin County Jail 0
Laredo Processing Center 0
Limestone County Detention Center 0
Mesa Verde ICE Processing Facility 0
Montgomery County Jail 0
Morgan County Adult Detention Center 0
Morrow County Correctional Facility 0
Orange County Jail 0
Platte County Detention Center 0
Pulaski County Detention Center 0
Rio Grande Processing Center 0
Robert A. Deyton Detention Facility 0
Rolling Plains Detention Center 0
Saint Clair County Jail 0
Seneca County Jail 0
Shawnee County Department of Corrections - Adult Detention Center 0
Sheriff Al Cannon Detention Center 0
Strafford County Corrections 0
Val Verde Correctional Facility 0
Washoe County Detention Center 0
Webb County Detention Center 0
Webb County Detention Facility 0
West Texas Detention Facility 0
Western Tennessee Detention Facility 0
Willacy County Regional Detention Facility 0
Worcester County Jail 0
Adams County Correctional Center NA
Alamance County Jail NA
Allen Parish Public Safety Complex NA
Aurora ICE Processing Center NA
Aurora ICE Processing Center II - Annex NA
Bluebonnet Detention Center NA
Boone County Jail NA
Calhoun County Jail NA
Chase County Detention Center NA
Chippewa County Correctional Facility NA
Desert View Annex NA
Donald W. Wyatt Detention Facility NA
Dorchester County Detention Center NA
Eloy Detention Center NA
Freeborn County Adult Detention Center NA
Geauga County Jail NA
Howard County Detention Center NA
Jackson Parish Correctional Center NA
Jerome Combs Detention Center NA
Kay County Detention Center NA
LaSalle Correctional Center NA
LaSalle County Regional Detention Center NA
Monroe County Inmate Dormitory NA
Northwest Contract Detention Center NA
Richwood Correctional Center NA
River Correctional Center NA
South Louisiana ICE Processing Center NA
Winn Correctional Center NA
Yuba County Jail NA
# Use Color Brewer to set colors and modify
# the last color to be black for totals.
plot_colors <- brewer.pal(2, "Paired")

df_324_inc %>%
  
  # Subset the df to only the used cols
  select(id, facility, date,
       hunger_strikes
       ) %>% 
  drop_na() %>% 
 

  # Calling the plot and formatting
  ggplot(aes(x=date, y = hunger_strikes))+
  geom_line(size = .65) +
  
  # scale_color_manual(
  #   values = plot_colors,
  #   labels = c(
  #     "Suicide Attempts or Self Harm",
  #     "Suicide Watches/Constant Watch/Mental Health Observation"
  #     ),
  #   name = "Type:"
  #   )+
  # 
  labs(title = "Hunger Strikes")+
  ylab("Number of Hunger Strikes")+
  xlab("Date")+
  theme(
    strip.text = element_text(size = 5),
    legend.position = "bottom"
    )+
  
  # Set the legend to multiple rows
  guides(col = guide_legend(nrow =5))+
  
  # Wrap
  facet_wrap(~ facility, ncol = 3)

8 Cause of Death

8.1 Suicide as Cause of Death

Bar plot of ICE and non-ICE deaths by suicide plotted by facility as of 2021-06-24.

df_324 %>% 
  select(id,
         facility,
         state,
         date,
         fac_operator,
         cod_suicide_ice,
         cod_suicide_not_ice) %>% 
  drop_na() %>% 
  filter(cod_suicide_ice>0|cod_suicide_not_ice >0) %>% 
  mutate(cod_suicide_total = cod_suicide_ice + cod_suicide_not_ice) %>% 
  
  # Here one could call datatable() or kable()
  # to get a list of the facilities and count
  
  # Initiate the plot
  ggplot(aes(x=cod_suicide_total, y=facility))+
  geom_boxplot()+
  scale_x_continuous(breaks = c(1,2))+
  labs(title = "Cause of Death Suicide",
       subtitle = "Includes ICE and non-ICE Deaths by Suicide")+
  xlab("COD Suicide Total")+
  ylab("Facility")

9 Observations

Observations made on the data as they accumulate are logged below.

9.1 28 May 2021

  1. Adelanto ICE Processing Center - East and West have identical data for 2020, but the numbers are different for 2019 with East being much lower than west. Craig checked the inspections and the numbers are different for East and West in 2019 while they are in fact the same for 2020. Note that 2020 is a remote inspection. However, it is significant that the two are comparable in one instance and not comparable in another case.

  2. Almance County Jail and Chase County Detention Center both seem to register blank for solitary. Craig suspects this is because there were not cases of solitary reported.

9.2 27 May 2021

One of the important early observations has to do with the naming of facilities. ICE is often inconsistent with facility naming and the names do often change over time. Both the changing of names and inconsistent naming conventions can cause confusion as well as error when tabulating results.

  1. The graphs for “Adelanto ICE Processing Center - East” and “Adelanto ICE Processing Center - West” are identical. This is consistent with information Craig recalls seeing in one of the inspections, that the numbers for the facilities are “merged” or combined.

    • For facet graphing consider filtering. For analysis purposes may need to treat the two facilities as “merged”
  2. Adelanto ICE Processing Center West” should be combined with “Adelanto ICE Processing Center - West.” It appears that ICE is not consistently naming the facilities, in one case the name lacks a dash character which causes them to be graphed separately.

    • The dash was added to Adelanto West.
  3. It would be good to check if there really two facilities in Almance County. There are entries listed for “Almance County Detention Center” and “Almance County Jail.”

    • Need to verify that these are in fact distinct facilities.
  4. Aurora ICE Processing Center II - Annex” and “Aurora II Annex” should probably be combined. Need to check the inspections to verify.

    • Aurora II Annex (CO) - Jan. 29, 2021" was changed to”Aurora ICE Processing Center II - Annex (CO) - Jan. 29, 2021"

10 References

Bryan, Jennifer. 2021. Googlesheets4: Access Google Sheets Using the Sheets API V4. https://github.com/tidyverse/googlesheets4.
MA AG. 2020. “Investigation into the Events of May 1, 2020 at the c. Carlos Carreiro Immigration Detention Center, Unit b, Bristol County Sheriffs Office.” Boston, MA. https://www.mass.gov/doc/ago-report-into-bcso-response-to-may-1-disturbance/download.
Spinu, Vitalie, Garrett Grolemund, and Hadley Wickham. 2021. Lubridate: Make Dealing with Dates a Little Easier. https://CRAN.R-project.org/package=lubridate.
Swetlitz, Ike. 2020. “’Suddenly They Started Gassing Us’: Cuban Migrants Tell of Shocking Attack at ICE Prison.” https://www.theguardian.com/us-news/2020/jul/02/cuban-migrants-detention-ice-facility-new-mexico.
Tukey, John Wilder. 1977. Exploratory Data Analysis. Addison-Wesley Series in Behavioral Science. Reading, Mass: Addison-Wesley Pub. Co.
Wickham, Hadley, Winston Chang, Lionel Henry, Thomas Lin Pedersen, Kohske Takahashi, Claus Wilke, Kara Woo, Hiroaki Yutani, and Dewey Dunnington. 2021. Ggplot2: Create Elegant Data Visualisations Using the Grammar of Graphics. https://CRAN.R-project.org/package=ggplot2.
Wickham, Hadley, and Jim Hester. 2020. Readr: Read Rectangular Text Data. https://CRAN.R-project.org/package=readr.
LS0tDQp0aXRsZTogIlByZWxpbWluYXJ5IFJlYWRpbmcgYW5kIEdyYXBoaW5nIG9mIEluc3BlY3Rpb24gRGF0YSINCmF1dGhvcjogIk5hdGhhbiBDcmFpZyINCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVBICVCICVkLCAlWScpYCINCm91dHB1dDoNCiAgYm9va2Rvd246Omh0bWxfZG9jdW1lbnQyOiANCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQpiaWJsaW9ncmFwaHk6IFtjaXRhdGlvbnMuYmliLCBwYWNrYWdlcy5iaWJdDQotLS0NCg0KRHVyaW5nIHRoZSBTdW1tZXIgb2YgMjAyMSwgZGF0YSBmcm9tIElDRSBmYWNpbGl0eSBpbnNwZWN0aW9ucyB3YXMgY29tcGlsZWQgaW50byBhIHNlcmllcyBvZiBzcHJlYWRzaGVldHMuIFRoZSBpbXBldHVzIGZvciB0aGUgcHJvamVjdCB3YXMgTmF0aGFuIENyYWlnIHdobyB3YXMgaW50ZXJlc3RlZCBpbiBjb2xsYXRpbmcgdGhlIGRhdGEgdG8gZXhhbWluZSB0aGVtIGZvciB0cmVuZHMsIHBhdHRlcm5zLCBhbmQgYW5vbWFsaWVzLiBUaGUgd29yayB3YXMgcGVyZm9ybWVkIGJ5IHRocmVlIHN0dWRlbnRzIGZ1bmRlZCB1bmRlciBhIE5hdGlvbmFsIFNjaWVuY2UgRm91bmRhdGlvbiBncmFudCBhd2FyZGVkIHRvIERyLiBOZWlsIEhhcnZleSAoTk1TVSkgYW5kIERyLiBKZXJlbXkgU2xhY2sgKE5NU1UpLiBUaGUgc3R1ZGVudHMgd2hvIHBlcmZvcm1lZCB0aGUgd29yayB3ZXJlIEp1YW4gQmVjZXJyYSAoU3RhbmZvcmQpLCBBdmlnYWlsIFR1cmltYSBSb21vIChDb2x1bWJpYSksIGFuZCBEYW5pZWxhIE5hdmFycm8gVmVyZHVnbyAoQ1NTTE8pLiBUaGUgdGhyZWUgc3R1ZGVudHMgd29ya2VkIHdpdGggTmF0aGFuIENyYWlnIChOTVNVIGFuZCBBVklEKSB0byBkZXZlbG9wIGEgd29ya2Zsb3cgZm9yIGNvbXBpbGluZyBpbmRpdmlkdWFsIHJlcG9ydCBzaWduaWZpY2FudCBpbmNpZGVudCBzdW1tYXJ5IGZvcm1zIGFuZCBpbnNwZWN0aW9uIGNvdmVyIGxldHRlcnMgaW50byBhIHNlcmllcyBvZiBzcHJlYWRzaGVldHMuDQoNClRoaXMgZG9jdW1lbnQgaXMgYSBwcmVsaW1pbmFyeSBwcm9vZiBvZiBjb25jZXB0IGFuZCBpbml0aWFsIGV4cGxvcmF0b3J5IGRhdGEgYW5hbHlzaXMgW0B0dWtleTE5NzddLiBHb2FscyBvZiB0aGUgZG9jdW1lbnQgYXJlIHRvOg0KDQotICAgaWxsdXN0cmF0ZSB0aGUga2luZHMgb2YgYW5hbHlzaXMgcG9zc2libGUgd2l0aCB0aGUgdGFidWxhdGlvbiBvZiBJQ0UgaW5zcGVjdGlvbiBkYXRhDQotICAgZGVtb25zdHJhdGUgY29kZSBmb3IgcmVhZGluZyB0aGUgc3ByZWFkc2hlZXQNCi0gICBzaG93IHNwZWNpZmljIHdyYW5nbGluZyBtZXRob2RzIHVuaXF1ZSB0byB0aGUgZGF0YSBzdHJ1Y3R1cmUNCi0gICBwcm92aWRlIHByZWxpbWluYXJ5IGV4cGxvcmF0b3J5IHBsb3Qgb2Ygc2VsZWN0IHZhcmlhYmxlcyBmcm9tIHRoZSBTaWduaWZpY2FudCBJbmNpZGVudCBTdW1tYXJ5IFNoZWV0cy4NCg0KVGhlIGRhdGEgYXJlIHByZXNlbnRseSBpbmNvbXBsZXRlIGFuZCByZXByZXNlbnQgcmVzdWx0cyBjb21waWxlZCBhcyBvZiBgciBTeXMuRGF0ZSgpYC4NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoDQoJZWNobyA9IFRSVUUsDQoJbWVzc2FnZSA9IEZBTFNFLA0KCXdhcm5pbmcgPSBGQUxTRQ0KKQ0KYGBgDQoNCmBgYHtyIGxvYWQtbGlicmFyaWVzfQ0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMNCg0KIyBSZWFkaW5nIGFuZCB3cmFuZ2xpbmcNCmxpYnJhcnkoZ29vZ2xlc2hlZXRzNCkNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoamFuaXRvcikNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeShEVCkNCg0KIyBQbG90dGluZw0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQoNCiMgVGFibGVzDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpgYGANCg0KIyBJbnRyb2R1Y3Rpb24NCg0KIyMgTWV0aG9kIGZvciBSZWFkaW5nIEctMzI0QS0xOS1pbmMgZm9ybQ0KDQpUaGUgY29kZSBmb3IgdGhpcyByZXBvcnQgaXMgc3BlY2lmaWMgdG8gZGF0YSBsb2dnZWQgaW4gdGhlIEctMzI0QS0xOSBmb3JtIGFuZCB0aGUgaW5jaWRlbnQgc3VtbWFyaWVzIHBvcnRpb24gb2YgdGhhdCBmb3JtLiBUaGUgaW5jaWRlbnQgc3VtbWFyeSBwb3J0aW9uIG9mIHRoaXMgZm9ybSBpcyBwcm9iYWJseSB0aGUgbW9zdCBjb21wbGV4IGRhdGEgc3RydWN0dXJlIGluIHRoZSBwcm9qZWN0IGFuZCBhbHNvIGNvbnRhaW5zIHRoZSBsYXJnZXN0IHZvbHVtZSBvZiBxdWFudGl0YXRpdmUgaW5mb3JtYXRpb24uIFRoZXJlZm9yZSwgaXQgc2VlbWVkIGxpa2UgYSBnb29kIHBsYWNlIHRvIHN0YXJ0IHdpdGggYW4gaW5pdGlhbCBwcm9vZiBvZiBjb25jZXB0Lg0KDQpBdCB0aGUgb3V0c2V0LCB0aGVyZSB3ZXJlIGlzc3VlcyByZWFkaW5nIGluIHRoZSBHb29nbGUgU2hlZXQuIFNldmVyYWwgb2YgdGhlIG51bWVyaWMgY29sdW1ucyByZWFkIGludG8gUiBhcyBsaXN0cyB3aGljaCB3YXMgdW5kZXNpcmFibGUuIEluIHRoZSBHb29nbGUgU2hlZXQsIENyYWlnIHNldCB0aGUgY29sdW1ucyB0byBgcGxhaW4gdGV4dGAgcmF0aGVyIHRoYW4gYGF1dG9gIGFuZCB0aGUgZGF0YSByZWFkIGluIGZpbmUgYXMgY2hhcmFjdGVyIGNvbHVtbnMuIFRoaXMgc2VlbWVkIHRvIHJlc29sdmUgdGhlIGlzc3VlIGZvciBhIHRpbWUsIGFuZCBpdCB3YXMgcG9zc2libGUgdG8gdXNlIHRoZSBgdHlwZV9jb252ZXJ0KClgIGZ1bmN0aW9uIGZyb20gdGhlIGByZWFkcmAgbGlicmFyeSBbQFItcmVhZHJdIHRvIGNvbnZlcnQgdGhlc2UgY29sdW1ucyB0byBudW1iZXJzLiBBZGRpdGlvbmFsIHN0ZXBzIHdlcmUgdGFrZW4gdG8gdXNlIHRoZSBgcmVhZF9zaGVldGAgZnVuY3Rpb24gb2YgdGhlIGBnb29nbGVzaGVldHM0YCBsaWJyYXJ5IFtAUi1nb29nbGVzaGVldHM0XSB0byBleHBsaWNpdGx5IHNldCB0aGUgY29sdW1uIHR5cGVzIHRvIGNoYXJhY3Rlci4NCg0KVGhlcmUgd2VyZSBhbHNvIHNvbWUgaXNzdWVzIHVzaW5nIGBsdWJyaWRhdGVgIFtAUi1sdWJyaWRhdGVdIHRvIHdyYW5nbGUgdGhlIG1vbnRoIGFuZCB5ZWFyIGZpZWxkcyB0byBhIHByb3BlciBkYXRlLiBDcmFpZyB3YXMgbm90IGFibGUgdG8gZGlzY2VybiB0aGUgY2F1c2Ugb2YgdGhlIGlzc3VlLiBIb3dldmVyLCBjaGFuZ2luZyB0aGUgbW9udGggZm9ybWF0IG9uIHRoZSBpbmNpZGVudCBzaGVldCBmcm9tIGFiYnJldmlhdGVkIHRvIGZ1bGx5IHdyaXR0ZW4gb3V0IG1vbnRocyBzb2x2ZWQgdGhlIGlzc3VlLiBUaG9zZSBjaGFuZ2VzIHdlcmUgbWFkZSBpbiB0aGUgbWFzdGVyIEdvb2dsZSBTaGVldCBhbmQgdGhlIGRhdGEgd2VyZSBjYWxsZWQgdXNpbmcgdGhlIGBnb29nbGVzaGVldHM0YCBsaWJyYXJ5Lg0KDQpgYGB7ciByZWFkLWRhdGEtMzI0fQ0KIyBSZWFkIGluIFNoZWV0IEctMzI0QS0xOQ0KZGZfMzI0IDwtIHJlYWRfc2hlZXQoImh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFpbTVWU2kzYklFaTEzTzhXUTU2d0VJWFN5TkVzdGJHTXlsWFhnRDliQUcwL2VkaXQjZ2lkPTE4NTgyMjcwNzEiLA0KICAgICAgICAgICAgICAgICBzaGVldD0iRy0zMjRBLTE5IiwNCiAgICAgICAgICAgICAgICAgY29sX25hbWVzID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgY29sX3R5cGVzID0gImMiKSAlPiUgDQogIGNsZWFuX25hbWVzKCkgJT4lIA0KDQogICMgQ2xlYW4gdXAgdGhlIGZhY2lsaXR5IG5hbWVzIHNlcGFyYXRpbmcgb3V0IGluc3BlY3Rpb24gZGF0ZSBhbmQgc3RhdGUNCiAgIyBOb3RlIHRoZSB1c2Ugb2YgYSBkb3VibGUgZXNjYXBlIGNoYXJhY3Rlci4gVGhpcyB3YXMgbmVjZXNzYXJ5Lg0KICBzZXBhcmF0ZSguLA0KICAgICAgICAgICBjb2wgPSBmYWNpbGl0eSwNCiAgICAgICAgICAgaW50byA9IGMoImZhY2lsaXR5IiwiaW5zcGVjdGlvbl9kYXRlIiksDQogICAgICAgICAgIHNlcCA9ICJcXCkgLSAiKSAlPiUNCiAgc2VwYXJhdGUoLiwNCiAgICAgICAgICAgY29sID0gZmFjaWxpdHksDQogICAgICAgICAgIGludG8gPSBjKCJmYWNpbGl0eSIsInN0YXRlIiksDQogICAgICAgICAgIHNlcCA9ICJcXCgiKSAlPiUgDQoNCiAgIyBDb252ZXJ0IHRoZSBjaGFyYWN0ZXIgdHlwZSBjb2xzIHRvIG51bWJlcnMNCiAgIyB0eXBlX2NvbnZlcnQoKSAlPiUNCiAgbXV0YXRlKGZhY2lsaXR5ID0gYXMuZmFjdG9yKGZhY2lsaXR5KSwNCiAgICAgICAgIHN0YXRlID0gYXMuZmFjdG9yKHN0YXRlKSwNCiAgICAgICAgIGRhdGUgPSBtZHkoaW5zcGVjdGlvbl9kYXRlKSwNCiAgICAgICAgIGN1cnJlbnRfaW5zcGVjdGlvbl9kYXRlX2Zyb20gPSBtZHkoY3VycmVudF9pbnNwZWN0aW9uX2RhdGVfZnJvbSksDQogICAgICAgICBjdXJyZW50X2luc3BlY3Rpb25fZGF0ZV90byA9IG1keShjdXJyZW50X2luc3BlY3Rpb25fZGF0ZV90bykNCiAgICAgICAgICkgJT4lIA0KICByZWxvY2F0ZShkYXRlLCAuYmVmb3JlID0gaW5zcGVjdGlvbl9kYXRlKSAlPiUgDQogIG11dGF0ZV9hdChjKDIwOjQ5KSwgYXMubnVtZXJpYykNCmBgYA0KDQpgYGB7ciByZWFkLWRhdGEtMzI0LWluY2lkZW50fQ0KIyBSZWFkIEdvb2dsZSBTaGVldCBpbmNpZGVudCB3b3Jrc2hlZXQsIGNvbnZlcnQgdG8gZGF0YSBmcmFtZSwgYW5kIHdyYW5nbGUNCmRmXzMyNF9pbmMgPC0gcmVhZF9zaGVldCgiaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMWltNVZTaTNiSUVpMTNPOFdRNTZ3RUlYU3lORXN0YkdNeWxYWGdEOWJBRzAvZWRpdCNnaWQ9MTg1ODIyNzA3MSIsDQogICAgICAgICAgICAgICAgIHNoZWV0PSJHLTMyNEEtMTktaW5jIiwNCiAgICAgICAgICAgICAgICAgY29sX3R5cGVzID0gImMiKSAlPiUgDQogIGNsZWFuX25hbWVzKCkgJT4lIA0KDQogICMgQ2xlYW4gdXAgdGhlIGZhY2lsaXR5IG5hbWVzIHNlcGFyYXRpbmcgb3V0IGluc3BlY3Rpb24gZGF0ZSBhbmQgc3RhdGUNCiAgIyBOb3RlIHRoZSB1c2Ugb2YgYSBkb3VibGUgZXNjYXBlIGNoYXJhY3Rlci4gVGhpcyB3YXMgbmVjZXNzYXJ5Lg0KICBzZXBhcmF0ZSguLA0KICAgICAgICAgICBjb2wgPSBmYWNpbGl0eSwNCiAgICAgICAgICAgaW50byA9IGMoImZhY2lsaXR5IiwiaW5zcGVjdGlvbl9kYXRlIiksDQogICAgICAgICAgIHNlcCA9ICJcXCkgLSAiKSAlPiUNCiAgc2VwYXJhdGUoLiwNCiAgICAgICAgICAgY29sID0gZmFjaWxpdHksDQogICAgICAgICAgIGludG8gPSBjKCJmYWNpbGl0eSIsInN0YXRlIiksDQogICAgICAgICAgIHNlcCA9ICJcXCgiKSAlPiUgDQoNCiAgIyBDb252ZXJ0IHRoZSBjaGFyYWN0ZXIgdHlwZSBjb2xzIHRvIG51bWJlcnMNCiAgIyB0eXBlX2NvbnZlcnQoKSAlPiUgDQogIHVuaXRlKGRhdGUsIHllYXI6bW9udGgpICU+JSANCiAgbXV0YXRlKGZhY2lsaXR5ID0gYXMuZmFjdG9yKGZhY2lsaXR5KSwNCiAgICAgICAgIHN0YXRlID0gYXMuZmFjdG9yKHN0YXRlKSwNCiAgICAgICAgIGRhdGUgPSB5bShkYXRlKQ0KICAgICAgICAgKSAlPiUgDQogIG11dGF0ZV9hdChjKDY6NzYpLCBhcy5udW1lcmljKQ0KYGBgDQoNCkF0IHByZXNlbnQgYHIgbnJvdyhkZl8zMjQpYCBvdXQgb2YgYXBwcm94aW1hdGVseSAzMDAgYXJlIGNvbXBsZXRlLiBUaGUgaW5zcGVjdGlvbnMgcmFuZ2UgaW4gdGltZSBmcm9tIGByIG1pbihkZl8zMjQkZGF0ZSwgbmEucm0gPSBUUlVFKWAgdG8gYHIgbWF4KGRmXzMyNCRkYXRlLCBuYS5ybSA9IFRSVUUpYC4NCg0KIyMgU3VtbWFyeSBUYWJsZXMNCg0KU3VtbWFyeSB0YWJsZXMgaGVscCB0byBwcm92aWRlIGFuIG92ZXJ2aWV3IG9mIGhvdyBtYW55IGluc3RhbmNlcyBvY2N1ciB3aXRoaW4gcGFydGljdWxhciBjYXRlZ29yeSBvZiBkYXRhIG9yIGhvdyBmcmVxdWVudCBhIHBhcnRpY3VsYXIgaXNzdWUgaXMgcmVjb3JkZWQgYXQgYSBnaXZlbiBmYWNpbGl0eS4gU3VtbWFyeSB0YWJsZXMgYXJlIGdlbmVyYXRlZCB1c2luZyBhIGNvbWJpbmF0aW9uIG9mIGBncm91cF9ieWAgd2l0aCBgc3VtbWFyaXplYCB3aXRoIHRoZSByZXN1bHRzIHBpcGVkIHRvIGBrYWJsZWAgYW5kIGBrYWJsZUV4dHJhYC4NCg0KYGBge3IgaW5zcGVjdGlvbi1jb3VudH0NCmRmX2ZhY2lsaXR5IDwtIGRmXzMyNCAlPiUgDQogIGdyb3VwX2J5KGZhY2lsaXR5KSAlPiUgDQogIHN1bW1hcmlzZShuX2luc3BlY3Rpb25zID0gbigpKSAlPiUgDQogIHVuZ3JvdXAoKSANCiAgDQpkZl9mYWNpbGl0eSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiSW5zcGVjdGlvbnMgUmV2aWV3ZWQgYnkgRmFjaWxpdHkiLA0KICAgICAgICBjb2wubmFtZXMgPSBjKCJGYWNpbGl0eSIsICJJbnNwZWN0aW9ucyBSZXZpZXdlZCIpKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYygiaG92ZXIiLCAic3RyaXBlZCIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpKSAlPiUgDQogIHNjcm9sbF9ib3goaGVpZ2h0ID0gIjMwMHB4IikNCmBgYA0KDQojIyBGYWNldCBQbG90cw0KDQpGYWNldCBwbG90cyBhcmUgcHJvZHVjZWQgZm9yIHNldmVyYWwgY2F0ZWdvcmllcyBvZiBkYXRhLiBXaXRoaW4gZWFjaCBjYXRlZ29yeSwgY29sdW1ucyBhcmUgcGl2b3RlZCBsb25nZXIgYW5kIHBsb3R0ZWQgYnkgZGF0ZS4gR3JhcGhpbmcgaXMgZG9uZSB1c2luZyB0aGUgYGdncGxvdDJgIGxpYnJhcnkgW0BSLWdncGxvdDJdIHdpdGggdGhlIGBmYWNldF93cmFwYCBmdW5jdGlvbiB0byBwcm92aWRlIGEgbWVhbnMgdG8gY29tcGFyZSBtdWx0aXBsZSBmYWNpbGl0aWVzIHNpbXVsdGFuZW91c2x5LiBTdWNoIGEgcGxvdCBjYW4gaGVscCBpZGVudGlmeSB0cmVuZHMgYW5kIGd1aWRlIG1vcmUgc3BlY2lmaWMgcXVlc3Rpb25zLg0KDQojIEFzc2F1bHRzDQoNClRoZSBJQ0UgRy0zMjRBIFNpZ25pZmljYW50IEluY2lkZW50IFN1bW1hcnkgc2hlZXQgY29udGFpbnMgaW5mb3JtYXRpb24gb24gYSBudW1iZXIgb2YgZGlmZmVyZW50IGtpbmRzIG9mIGFzc2F1bHRzLiBTcGVjaWZpY2FsbHksIHRoZXJlIGFyZSBmb3VyIGNhdGVnb3JpZXMgb2YgYXNzYXVsdHMgbGlzdGVkOg0KDQotICAgRGV0YWluZWQgUGVyc29uIG9uIFN0YWZmIHdpdGggU2VyaW91cyBJbmp1cnkNCi0gICBEZXRhaW5lZCBQZXJzb24gb24gU3RhZmYgd2l0aG91dCBTZXJpb3VzIEluanVyeQ0KLSAgIERldGFpbmVkIFBlcnNvbiBvbiBEZXRhaW5lZCBQZXJzb24gd2l0aCBTZXJpb3VzIEluanVyeQ0KLSAgIERldGFpbmVkIFBlcnNvbiBvbiBEZXRhaW5lZCBQZXJzb24gd2l0aG91dCBTZXJpb3VzIEluanVyeQ0KDQpDb25zcGljdW91c2x5IGFic2VudCBmcm9tIHRoaXMgbGlzdCBvZiBhc3NhdWx0IHR5cGVzIGFyZSBhc3NhdWx0cyBvbiBkZXRhaW5lZCBwZXJzb25zIGJ5IHN0YWZmLiBUaGlzIGlzIGRlZXBseSBjb25jZXJuaW5nIGJlY2F1c2UgYWxyZWFkeSBpbml0aWFsIHJldmlldyBvZiBpbnNwZWN0aW9uIGZvcm1zIGFuZCBwcmlvciBuZXdzIHN0b3JpZXMgaW5kaWNhdGVzIHRoYXQgc3RhZmYgYXNzYXVsdHMgb24gZGV0YWluZWQgcGVyc29ucyBkbyBvY2N1ci4gRm9yIGV4YW1wbGUsIGF0IHRoZSBCcmlzdG9sIENvdW50eSBDb3VudHkgSmFpbCBhbmQgSG91c2Ugb2YgQ29ycmVjdGlvbnMgaW5kZXBlbmRlbnQgaW52ZXN0aWdhdGlvbiBieSB0aGUgTWFzc2FjaHVzZXR0cyBPZmZpY2Ugb2YgQXR0b3JuZXkgR2VuZXJhbCAoTUFPRykgZm91bmQgdGhhdCBmYWNpbGl0eSBzdGFmZiBmb3VuZCBhICJwbGFubmVkIGFuZCBkZWxpYmVyYXRlLXVzZSBvZiBmb3JjZSBhZ2FpbnN0IHRoZSBJQ0UgZGV0YWluZWVzIHRoYXQgd2FzIGRpc3Byb3BvcnRpb25hdGUgdG8gdGhlIHNlY3VyaXR5IG5lZWRzIGF0IHRoYXQgdGltZSBhbmQgdW5uZWNlc3NhcmlseSBjYXVzZWQsIG9yIHJpc2tlZCBjYXVzaW5nLCBoYXJtIHRvIGFsbCBpbnZvbHZlZCIgW0BtYWFnMjAyMCwgaWldLiBUaGUgTU9BRyBmb3VuZCB0aGF0IGZhY2lsaXR5IHN0YWZmIHVzZWQgImEgZmxhc2ggYmFuZyBncmVuYWRlLCBwZXBwZXItYmFsbCBsYXVuY2hlcnMsIHBlcHBlciBzcHJheSBjYW5pc3RlcnMsIGFudGktcmlvdCBzaGllbGRzLCBhbmQgY2FuaW5lcy0tYWdhaW5zdCBkZXRhaW5lZXMgd2hvIGhhZCBleGhpYml0ZWQgY2FsbSBhbmQgbm9udmlvbGVudCBiZWhhdmlvciBmb3IgYXQgbGVhc3QgYW4gaG91ciBiZWZvcmUgdGhpcyBvcGVyYXRpb24iIFtAbWFhZzIwMjAsIGlpXS4gSW52ZXN0aWdhdGlvbnMgZm91bmQgdGhhdCBzdGFmZiAiZGVwbG95ZWQgdGhlc2Ugd2VhcG9ucyBib3RoIGluZGlzY3JpbWluYXRlbHkgdXBvbiBlbnRyeSBhbmQgYWxzbyBzcGVjaWZpY2FsbHkgYWdhaW5zdCBkZXRhaW5lZXMgd2hvIHdlcmUgbm90IGNvbWJhdGl2ZSwgYXNzYXVsdGl2ZSwgb3Igb3RoZXJ3aXNlIGFjdGl2ZWx5IHJlc2lzdGluZyBzdGFmZiIgW0BtYWFnMjAyMCwgaWldLg0KDQpXaGlsZSB0aGUgYWZvcmVtZW50aW9uZWQgQnJpc3RvbCBDb3VudHkgSmFpbCBtYXkgYmUgYSBwYXJ0aWN1bGFybHkgZWdyZWdpb3VzIGluc3RhbmNlIG9mIHN0YWZmIGFzc2F1bHRpbmcgZGV0YWluZWQgcGVyc29ucywgaXQgaXMgbm90IGFuIGlzb2xhdGVkIGNhc2UuIEZvciBleGFtcGxlLCBbdmlkZW8gZXZpZGVuY2VdKGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9SlBfUGZPaGRMdU0pIGZyb20gdGhlIFRvcnJhbmNlIENvdW50eSBEZXRlbnRpb24gRmFjaWxpdHkgaW4gRXN0YW5jaWEgTk0gc2hvd3MgQ29yZUNpdmljJ3MgcHJpdmF0ZSBmYWNpbGl0eSBzdGFmZiBwZXBwZXIgc3ByYXlpbmcgcGVyc29ucyBkZXRhaW5lZCBieSBJQ0Ugb24gaHVuZ2VyIHN0cmlrZSBbQHN3ZXRsaXR6MjAyMF0uIFJldmlldyBvZiBpbnNwZWN0aW9ucyBoYXMgYWxzbyByZXZlYWxlZCBhZGRpdGlvbmFsIGluYXBwcm9wcmlhdGUgdXNlIG9mIGZvcmNlIGluY2lkZW50cy4gVGhlIG9taXNzaW9uIG9mIGEgZmllbGQgdG8gcmVjb3JkIGluc3RhbmNlcyBvZiBzdGFmZiBhc3NhdWx0aW5nIGRldGFpbmVkIHBlcnNvbnMgb2NjbHVkZXMgYW5kIG9ic2N1cmVzIHJlYWwgaW5zdGFuY2VzIG9mIHZpb2xlbmNlLiBBcyB0aGUgaW5zcGVjdGlvbnMgcHJvY2VzcyBpcyBhIGRldGVudGlvbiByZWZvcm0gZGVzaWduZWQgdG8gbWFrZSBhIG1vcmUgaHVtYW5lIHN5c3RlbSBvZiBjaXZpbCBpbmNhcmNlcmF0aW9uLCB0aGUgb21pc3Npb24gb2YgY2F0ZWdvcmllcyBmb3IgbG9nZ2luZyBzdGFmZiBwaHlzaWNhbCBtaXN0cmVhdG1lbnQgb2YgZGV0YWluZWQgcGVyc29ucyByYWlzZXMgc2VyaW91cyBxdWVzdGlvbnMgYWJvdXQgdGhlIGluc3BlY3Rpb25zIHByb2Nlc3NlcyBhYmlsaXR5IHRvIHJlY29yZCBzaWduaWZpY2FudCBhbmQgZG9jdW1lbnRlZCBjaXZpbCBhbmQgaHVtYW4gcmlnaHRzIHZpb2xhdGlvbnMuDQoNCiMjIFN1bW1hcnkgVGFibGVzDQoNCmBgYHtyIGFzc2F1bHQtZGZ9DQpkZl9hc3NhdWx0cyA8LSBkZl8zMjRfaW5jICU+JQ0KICANCiAgIyBTdWJzZXQgdGhlIGRmIHRvIG9ubHkgdGhlIHVzZWQgY29scw0KICBzZWxlY3QoaWQsIGZhY2lsaXR5LCBkYXRlLA0KICAgICAgIGRldGFpbmVlX3BoeXNpY2FsX2Fzc2F1bHRfb25fc3RhZmZfd2l0aF9zZXJpb3VzX2luanVyeToNCiAgICAgICBkZXRhaW5lZV9vbl9kZXRhaW5lZV9waHlzaWNhbF9hc3NhdWx0X2ZpZ2h0X3dpdGhfbm9fc2VyaW91c19pbmp1cnkNCiAgICAgICApICU+JSANCiAgDQogICMgTmVlZCB0aGUgcm93d2lzZSBmdW5jdGlvbiB0byBjb21wdXRlIGEgcm93LWF0LWEtdGltZQ0KICAjIGluIHRoZSBmb2xsb3dpbmcgbXV0YXRlIGZ1bmN0aW9uDQogIHJvd3dpc2UoaWQpICU+JSANCiAgDQogICMgQ3JlYXRlIGEgbmV3IHRvdGFsIGNvbHVtbg0KICBtdXRhdGUodG90YWxfYXNzYXVsdHMgPSBzdW0oY19hY3Jvc3MoDQogICAgICAgZGV0YWluZWVfcGh5c2ljYWxfYXNzYXVsdF9vbl9zdGFmZl93aXRoX3NlcmlvdXNfaW5qdXJ5Og0KICAgICAgIGRldGFpbmVlX29uX2RldGFpbmVlX3BoeXNpY2FsX2Fzc2F1bHRfZmlnaHRfd2l0aF9ub19zZXJpb3VzX2luanVyeQ0KICApKSkgJT4lIA0KDQogICMgQ2FsbCBhIHJhbmdlIG9mIHRhYmxlIGNvbHVtbnMgYW5kIHBpdm90IGxvbmcNCiAgcGl2b3RfbG9uZ2VyKC4sDQogICAgICAgICAgICAgICBjb2xzPSAgZGV0YWluZWVfcGh5c2ljYWxfYXNzYXVsdF9vbl9zdGFmZl93aXRoX3NlcmlvdXNfaW5qdXJ5OnRvdGFsX2Fzc2F1bHRzLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiYXNzYXVsdF90eXBlIiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJhc3NhdWx0X2NvdW50IikgJT4lIA0KICANCiAgIyBSZW1vdmUgTkEgVmFsdWVzDQogIGRyb3BfbmEoKSAlPiUgDQogIA0KICAjIEV4cGxpY2l0bHkgZGVmaW5lIGZhY3RvciBsZXZlbHMNCiAgbXV0YXRlKGFzc2F1bHRfdHlwZSA9IGZhY3Rvcihhc3NhdWx0X3R5cGUsIGxldmVscyA9IGMoDQogICAgImRldGFpbmVlX3BoeXNpY2FsX2Fzc2F1bHRfb25fc3RhZmZfd2l0aF9zZXJpb3VzX2luanVyeSIsDQogICAgImRldGFpbmVlX3BoeXNpY2FsX2Fzc2F1bHRfb25fc3RhZmZfd2l0aF9ub19zZXJpb3VzX2luanVyeSIsDQogICAgImRldGFpbmVlX29uX2RldGFpbmVlX3BoeXNpY2FsX2Fzc2F1bHRfZmlnaHRfd2l0aF9zZXJpb3VzX2luanVyeSIsDQogICAgImRldGFpbmVlX29uX2RldGFpbmVlX3BoeXNpY2FsX2Fzc2F1bHRfZmlnaHRfd2l0aF9ub19zZXJpb3VzX2luanVyeSIsDQogICAgInRvdGFsX2Fzc2F1bHRzIg0KICApKSkNCmBgYA0KDQpgYGB7ciBhc3NhdWx0LXN1bW1hcnl9DQpkZl9hc3NhdWx0cyAlPiUgDQogIGdyb3VwX2J5KGFzc2F1bHRfdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoYFRvdGFsIEFzc2F1bHRzIGJ5IFR5cGVgID0gc3VtKGFzc2F1bHRfY291bnQpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiVG90YWwgQXNzYXVsdHMgYnkgVHlwZSIsDQogICAgICAgIGNvbC5uYW1lcyA9IGMoIkFzc2F1bHQgVHlwZSIsICJUb3RhbCBBc3NhdWx0IFR5cGUiKSkgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGMoImhvdmVyIiwgInN0cmlwZWQiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSkNCg0KDQpkZl9hc3NhdWx0cyAlPiUgDQogIGdyb3VwX2J5KGZhY2lsaXR5KSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbF9hc3NhdWx0cyA9IHN1bShhc3NhdWx0X2NvdW50KSkgJT4lIA0KICBhcnJhbmdlKGRlc2ModG90YWxfYXNzYXVsdHMpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiVG90YWwgQXNzYXVsdHMgYnkgRmFjaWxpdHkiLA0KICAgICAgICBjb2wubmFtZXMgPSBjKCJGYWNpbGl0eSIsICJUb3RhbCBBc3NhdWx0cyBieSBGYWNpbGl0eSIpKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYygiaG92ZXIiLCAic3RyaXBlZCIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpKSAlPiUgDQogIHNjcm9sbF9ib3goaGVpZ2h0ID0gIjMwMHB4IikNCmBgYA0KDQojIyBGYWNldCBvZiBBc3NhdWx0cyBieSBQbG90DQoNClRoZSBmaWd1cmUgYmVsb3cgaXMgYSBmYWNldCBwbG90IG9mIHRoZSBhc3NhdWx0IGNhdGVnb3JpZXMgcHJlc2VudCBvbiB0aGUgRy0zMjRBIFNJUyBmb3JtLg0KDQpgYGB7ciBhc3NhdWx0LWZhY2V0LCBmaWcuaGVpZ2h0PTQwfQ0KDQojIEdlbmVyYXRpbmcgYSBsaW5ldHlwZSB2ZWN0b3IgZm9yIHVzZSBpbiB0aGUgcGxvdA0KcGxvdF9saW5lcyA8LSBjKA0KICAgICJzb2xpZCIsDQogICAgInNvbGlkIiwNCiAgICAic29saWQiLA0KICAgICJzb2xpZCIsDQogICAgImRvdHRlZCINCiAgICApDQoNCiMgVXNlIENvbG9yIEJyZXdlciB0byBzZXQgY29sb3JzIGFuZCBtb2RpZnkNCiMgdGhlIGxhc3QgY29sb3IgdG8gYmUgYmxhY2sgZm9yIHRvdGFscy4NCnBsb3RfY29sb3JzIDwtIGJyZXdlci5wYWwoNSwgIlBhaXJlZCIpDQpwbG90X2NvbG9yc1s1XSA8LSAiIzAwMDAwMCINCg0KIyBDcmVhdGUgdGhlIGxhYmVscw0KcGxvdF9sYWJlbHMgPC0gYygNCiAgICAiRGV0YWluZWQgUGVyc29uIG9uIFN0YWZmIHcuIFNlcmlvdXMgSW5qdXJ5IiwNCiAgICAiRGV0YWluZWQgUGVyc29uIG9uIFN0YWZmIHcvbyBTZXJpb3VzIEluanVyeSIsDQogICAgIkRldGFpbmVkIFBlcnNvbiBvbiBEZXRhaW5lZCBQZXJzb24gdy4gU2Vyb3VzIEluanVyeSIsDQogICAgIkRldGFpbmVkIFBlcnNvbiBvbiBEZXRhaW5lZCBQZXJzb24gdy9vIFNlcm91cyBJbmp1cnkiLA0KICAgICJUb3RhbCBBc3NhdWx0cyIpDQoNCmRmX2Fzc2F1bHRzICU+JSANCiAgIyBDYWxsaW5nIHRoZSBwbG90IGFuZCBmb3JtYXR0aW5nDQogIGdncGxvdChhZXMoeD1kYXRlLCB5ID0gYXNzYXVsdF9jb3VudCwgbGluZXR5cGU9YXNzYXVsdF90eXBlKSkrDQogIGdlb21fbGluZShhZXMoY29sb3IgPSBhc3NhdWx0X3R5cGUpLCBzaXplID0uNjUpICsNCiAgDQogICMgU2V0IHRoZSBsaW5lIHR5cGUNCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKA0KICAgIHZhbHVlcyA9IHBsb3RfbGluZXMsDQogICAgbGFiZWxzID0gcGxvdF9sYWJlbHMsDQogICAgbmFtZSA9ICJBc3NhdWx0IFR5cGU6IiwNCiAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZChucm93ID0gNSkNCiAgICApKw0KICANCiAgIyBTZXR0aW5nIHRoZSBjb2xvcg0KICBzY2FsZV9jb2xvcl9tYW51YWwoDQogICAgdmFsdWVzID0gcGxvdF9jb2xvcnMsDQogICAgbGFiZWxzID0gcGxvdF9sYWJlbHMsDQogIG5hbWUgPSAiQXNzYXVsdCBUeXBlOiINCiAgKSsNCg0KICBsYWJzKHRpdGxlID0gIlJlcG9ydGVkIEFzc2F1bHRzIikrDQogIHlsYWIoIk51bWJlciBvZiBBc3NhdWx0cyIpKw0KICB4bGFiKCJEYXRlIikrDQogIHRoZW1lKA0KICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iDQogICAgKSsNCg0KICAjIFNldCB0aGUgbGVnZW5kIHRvIG11bHRpcGxlIHJvd3MNCiAgZ3VpZGVzKGNvbCA9IGd1aWRlX2xlZ2VuZChucm93ID01KSkrDQogIA0KICAjIFdyYXANCiAgZmFjZXRfd3JhcCh+IGZhY2lsaXR5LCBuY29sPTMpDQpgYGANCg0KIyBEaXNjaXBsaW5hcnkNCg0KQXMgYSBtYXR0ZXIgb2YgbGF3LCBJQ0UgZGV0ZW50aW9uIGlzIG5vdCBwdW5pdGl2ZSBpdCBpcyBwdXJlbHkgYWRtaW5pc3RyYXRpdmUgY2l2aWwgaG9sZGluZyB0byBlbnN1cmUgdGhhdCBpbmRpdmlkdWFscyBhcmUgcHJlc2VudCBmb3IgdGhlaXIgaW1taWdyYXRpb24gcHJvY2VlZGluZ3MuIERlc3BpdGUgdGhhdCBmYWN0LCB0aGVyZSBpcyBhIHRyZW1lbmRvdXMgYW1vdW50IG9mIHB1bml0aXZlIGRpc2NpcGxpbmFyeSBtZWFzdXJlcyB0aGF0IHRha2UgcGxhY2UgaW4gSUNFIGRldGVudGlvbi4gU29tZSBvZiB0aGlzIGluZm9ybWF0aW9uIG9uIGRpc2NpcGxpbmUgaW4gSUNFIGRldGVudGlvbiBpcyBsb2dnZWQgaW4gZmFjaWxpdHkgaW5zcGVjdGlvbnMuIEFzIHNlZW4gaW4gdGhlIHRhYmxlcyBiZWxvdywgZHVyaW5nIHRoZSBjdXJyZW50IHNhbXBsZSBwZXJpb2QgdGhlcmUgd2VyZSBtb3JlIHRoYW4gNDIsMDAwIGRpc2NpcGxpbmFyeSBpbmZyYWN0aW9ucy4NCg0KIyMgU3VtbWFyeSBUYWJsZXMNCg0KYGBge3J9DQpkZl9kaXNjaXBsaW5lIDwtIGRmXzMyNF9pbmMgJT4lDQogIA0KICAjIFN1YnNldCB0aGUgZGYgdG8gb25seSB0aGUgdXNlZCBjb2xzDQogIHNlbGVjdChpZCwgZmFjaWxpdHksIGRhdGUsDQogICAgICAgZGlzY2lwbGluYXJ5X2luZnJhY3Rpb25zOg0KICAgICAgIHNhbmN0aW9uc19vdmVyXzYwX2RheXMNCiAgICAgICApICU+JSANCiAgDQogICMgTmVlZCB0aGUgcm93d2lzZSBmdW5jdGlvbiB0byBjb21wdXRlIGEgcm93LWF0LWEtdGltZQ0KICAjIGluIHRoZSBmb2xsb3dpbmcgbXV0YXRlIGZ1bmN0aW9uDQogIHJvd3dpc2UoaWQpICU+JSANCiAgDQogICMgQ3JlYXRlIGEgbmV3IHRvdGFsIGNvbHVtbg0KICBtdXRhdGUodG90YWxfZGlzY2lwbGluYXJ5ID0gc3VtKGNfYWNyb3NzKA0KICAgICAgIGRpc2NpcGxpbmFyeV9pbmZyYWN0aW9uczoNCiAgICAgICBzYW5jdGlvbnNfb3Zlcl82MF9kYXlzDQogICkpKSAlPiUgDQoNCiAgIyBDYWxsIGEgcmFuZ2Ugb2YgdGFibGUgY29sdW1ucyBhbmQgcGl2b3QgbG9uZw0KICBwaXZvdF9sb25nZXIoLiwNCiAgICAgICAgICAgICAgIGNvbHM9ICBkaXNjaXBsaW5hcnlfaW5mcmFjdGlvbnM6dG90YWxfZGlzY2lwbGluYXJ5LA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiZGlzY2lwbGluYXJ5X3R5cGUiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gImRpc2NpcGxpbmFyeV9jb3VudCIpICU+JQ0KICANCiAgIyBSZW1vdmUgTkEgdmFsdWVzDQogIGRyb3BfbmEoKSAlPiUgDQogIA0KICAjIEV4cGxpY2l0bHkgc2V0IGZhY3RvciBsZXZlbHMNCiAgbXV0YXRlKGRpc2NpcGxpbmFyeV90eXBlID0gZmFjdG9yKGRpc2NpcGxpbmFyeV90eXBlLCBsZXZlbHMgPWMoDQogICAgImRpc2NpcGxpbmFyeV9pbmZyYWN0aW9ucyIsDQogICAgImRpc2NpcGxpbmFyeV9pbmZyYWN0aW9uc19ndWlsdHkiLA0KICAgICJkaXNjaXBsaW5hcnlfYXBwZWFscyIsDQogICAgImRpc2NpcGxpbmFyeV9hcHBlYWxzX2ZvdW5kX2luX2Zhdm9yX29mX2RldGFpbmVlIiwNCiAgICAic2FuY3Rpb25zX292ZXJfNjBfZGF5cyIsDQogICAgInRvdGFsX2Rpc2NpcGxpbmFyeSINCiAgKSkpDQpgYGANCg0KYGBge3J9DQpkZl9kaXNjaXBsaW5lICU+JSANCiAgZ3JvdXBfYnkoZGlzY2lwbGluYXJ5X3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGBUb3RhbCBEaXNjaXBsaW5hcnkgYnkgVHlwZWAgPSBzdW0oZGlzY2lwbGluYXJ5X2NvdW50KSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIlRvdGFsIERpc2NpcGxpbmFyeSBieSBUeXBlIiwNCiAgICAgICAgY29sLm5hbWVzID0gYygiRGlzY2lwbGluZSBUeXBlIiwgIlRvdGFsIERpc2NpcGxpbmUgVHlwZSIpKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYygiaG92ZXIiLCAic3RyaXBlZCIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpKQ0KDQoNCmRmX2Rpc2NpcGxpbmUgJT4lIA0KICBncm91cF9ieShmYWNpbGl0eSkgJT4lIA0KICBzdW1tYXJpc2UodG90YWxfZGlzY2lwbGluYXJ5ID0gc3VtKGRpc2NpcGxpbmFyeV9jb3VudCkpICU+JSANCiAgYXJyYW5nZShkZXNjKHRvdGFsX2Rpc2NpcGxpbmFyeSkpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJUb3RhbCBEaXNjaXBsaW5lIGJ5IEZhY2lsaXR5IiwNCiAgICAgICAgY29sLm5hbWVzID0gYygiRmFjaWxpdHkiLCAiVG90YWwgRGlzY2lwbGluZSBieSBGYWNpbGl0eSIpKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYygiaG92ZXIiLCAic3RyaXBlZCIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpKSAlPiUgDQogIHNjcm9sbF9ib3goaGVpZ2h0ID0gIjMwMHB4IikNCmBgYA0KDQojIyBGYWNldCBQbG90IG9mIERpc2NpcGxpbmFyeSBieSBGYWNpbGl0eQ0KDQpgYGB7ciBkaXNjaXBsaW5hcnktZmFjZXQsIGZpZy5oZWlnaHQ9NDB9DQojIEdlbmVyYXRpbmcgYSBsaW5ldHlwZSB2ZWN0b3IgZm9yIHVzZSBpbiB0aGUgcGxvdA0KcGxvdF9saW5lcyA8LSBjKA0KICAgICJzb2xpZCIsDQogICAgInNvbGlkIiwNCiAgICAic29saWQiLA0KICAgICJzb2xpZCIsDQogICAgInNvbGlkIiwNCiAgICAiZG90dGVkIg0KICAgICkNCg0KIyBVc2UgQ29sb3IgQnJld2VyIHRvIHNldCBjb2xvcnMgYW5kIG1vZGlmeQ0KIyB0aGUgbGFzdCBjb2xvciB0byBiZSBibGFjayBmb3IgdG90YWxzLg0KcGxvdF9jb2xvcnMgPC0gYnJld2VyLnBhbCg2LCAiUGFpcmVkIikNCnBsb3RfY29sb3JzWzZdIDwtICIjMDAwMDAwIg0KDQojIENyZWF0ZSBwbG90IGxhYmVscw0KDQpwbG90X2xhYmVscyA8LSBjKA0KICAgICJEaXNjaXBsaW5hcnkgSW5mcmFjdGlvbnMiLA0KICAgICJEaXNjaXBsaW5hcnkgSW5mcmFjdGlvbnMgLSBHdWlsdHkiLA0KICAgICJEaXNjaXBsaW5hcnkgQXBwZWFscyIsDQogICAgIkRpc2NpcGxpbmFyeSBBcHBlYWxzIGluIEZhdm9yIG9mIERldGFpbmVlIiwNCiAgICAiU2FuY3Rpb25zIE92ZXIgNjAgRGF5cyIsDQogICAgIlRvdGFsIERpc2NpcGxpbmFyeSIpDQoNCg0KZGZfZGlzY2lwbGluZSAlPiUgDQogIA0KICAjIENhbGxpbmcgdGhlIHBsb3QgYW5kIGZvcm1hdHRpbmcNCiAgZ2dwbG90KGFlcyh4PWRhdGUsDQogICAgICAgICAgICAgeSA9IGRpc2NpcGxpbmFyeV9jb3VudCwNCiAgICAgICAgICAgICBsaW5ldHlwZSA9IGRpc2NpcGxpbmFyeV90eXBlKSkrDQogIGdlb21fbGluZShhZXMoY29sb3IgPSBkaXNjaXBsaW5hcnlfdHlwZSksIHNpemUgPSAuNjUpICsNCiAgDQogICMgU2V0IHRoZSBsaW5ldHlwZQ0KICBzY2FsZV9saW5ldHlwZV9tYW51YWwoDQogICAgdmFsdWVzID0gcGxvdF9saW5lcywNCiAgICBsYWJlbHMgPSBwbG90X2xhYmVscywNCiAgICBuYW1lID0gIkRpc2NpcGxpbmFyeSBUeXBlOiIsDQogICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQobnJvdyA9IDYpDQogICAgKSsNCiAgDQogICMgU2V0dGluZyB0aGUgY29sb3INCiAgc2NhbGVfY29sb3JfbWFudWFsKA0KICB2YWx1ZXMgPSBwbG90X2NvbG9ycywNCiAgbGFiZWxzID0gcGxvdF9sYWJlbHMsDQogIG5hbWUgPSAiRGlzY2lwbGluYXJ5IFR5cGU6Ig0KICApKw0KDQogIGxhYnModGl0bGUgPSAiRGlzY2lwbGluYXJ5IikrDQogIHlsYWIoIk51bWJlciBvZiBEaXNjaXBsaW5hcnkgSW5mcmFjdGlvbnMiKSsNCiAgeGxhYigiRGF0ZSIpKw0KICB0aGVtZSgNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIg0KICAgICkrDQoNCiAgIyBTZXQgdGhlIGxlZ2VuZCB0byBtdWx0aXBsZSByb3dzDQogIGd1aWRlcyhjb2wgPSBndWlkZV9sZWdlbmQobnJvdyA9NikpKw0KICANCiAgIyBXcmFwDQogIGZhY2V0X3dyYXAofiBmYWNpbGl0eSwgbmNvbD0zKQ0KYGBgDQoNCiMgU29saXRhcnkNCg0KIyMgU3VtbWFyeSBUYWJsZXMNCg0KT2YgdGhlIHByZXNlbnQgMTYzIGluc3BlY3Rpb25zIHJldmlld2VkIHNvIGZhciwgdGhlcmUgYXJlIG1vcmUgdGhhbiAzNCwwMDAgaW5zdGFuY2VzIG9mIHNvbGl0YXJ5LiBUaGF0IGlzIHJvdWdobHkgMjA4IGluc3RhbmNlcyBvZiBzb2xpdGFyeSBwZXIgaW5zcGVjdGlvbi4NCg0KYGBge3J9DQpkZl9zb2xpdGFyeSA8LSBkZl8zMjRfaW5jICU+JQ0KICANCiAgIyBTZWxlY3QgYSBzdWJzZXQgb2YgY29sdW1ucyB0byB3b3JrIHdpdGgNCiAgc2VsZWN0KGlkLA0KICAgICAgICAgZmFjaWxpdHksDQogICAgICAgICBkYXRlLA0KICAgICAgICAgZGV0YWluZWVzX3BsYWNlZF9pbl9hZG1pbmlzdHJhdGl2ZV9zZWdyZWdhdGlvbjoNCiAgICAgICAgICAgZGV0YWluZWVzX3BsYWNlZF9pbl9zZWdyZWdhdGlvbl9mb3JfbWVudGFsX2hlYWx0aF9yZWFzb25zKSAlPiUgDQogIA0KICAjIE5lZWQgdGhlIHJvd3dpc2UgZnVuY3Rpb24gdG8gY29tcHV0ZSBhIHJvdy1hdC1hLXRpbWUNCiAgIyBpbiB0aGUgZm9sbG93aW5nIG11dGF0ZSBmdW5jdGlvbg0KICByb3d3aXNlKGlkKSAlPiUgDQogIA0KICAjIENyZWF0ZSBuZXcgdG90YWwgY29sdW1uDQogIG11dGF0ZSh0b3RhbF9zZWdyZWdhdGlvbiA9IHN1bShjX2Fjcm9zcyhkZXRhaW5lZXNfcGxhY2VkX2luX2FkbWluaXN0cmF0aXZlX3NlZ3JlZ2F0aW9uOg0KICAgICAgICAgICAgICAgICBkZXRhaW5lZXNfcGxhY2VkX2luX3NlZ3JlZ2F0aW9uX2Zvcl9tZW50YWxfaGVhbHRoX3JlYXNvbnMpKSkgJT4lIA0KICANCiAgIyBUaWR5DQogIHBpdm90X2xvbmdlciguLA0KICAgICAgICAgICAgICAgY29scz0gZGV0YWluZWVzX3BsYWNlZF9pbl9hZG1pbmlzdHJhdGl2ZV9zZWdyZWdhdGlvbjoNCiAgICAgICAgICAgICAgICAgdG90YWxfc2VncmVnYXRpb24sDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJzZWdyZWdhdGlvbl90eXBlIiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJzZWdyZWdhdGlvbl9jb3VudCIpICU+JSANCiAgDQogICMgUmVtb3ZlIE5BDQogIGRyb3BfbmEoKSAlPiUgDQogIA0KICAjIEV4cGxpY2l0bHkgc2V0IGZhY3RvciBsZXZlbHMNCiAgbXV0YXRlKHNlZ3JlZ2F0aW9uX3R5cGUgPSBmYWN0b3Ioc2VncmVnYXRpb25fdHlwZSwgbGV2ZWxzID0gYygNCiAgICAiZGV0YWluZWVzX3BsYWNlZF9pbl9hZG1pbmlzdHJhdGl2ZV9zZWdyZWdhdGlvbiIsDQogICAgImRldGFpbmVlc19wbGFjZWRfaW5fZGlzY2lwbGluYXJ5X3NlZ3JlZ2F0aW9uIiwNCiAgICAiZGV0YWluZWVzX3BsYWNlZF9pbl9zZWdyZWdhdGlvbl9mb3JfbWVkaWNhbF9yZWFzb25zIiwNCiAgICAiZGV0YWluZWVzX3BsYWNlZF9pbl9zZWdyZWdhdGlvbl9mb3JfbWVudGFsX2hlYWx0aF9yZWFzb25zIiwNCiAgICAidG90YWxfc2VncmVnYXRpb24iDQogICkpKQ0KYGBgDQoNCmBgYHtyfQ0KZGZfc29saXRhcnkgJT4lIA0KICBncm91cF9ieShzZWdyZWdhdGlvbl90eXBlKSAlPiUgDQogIHN1bW1hcmlzZShgVG90YWwgU29saXRhcnkgYnkgVHlwZWAgPSBzdW0oc2VncmVnYXRpb25fY291bnQpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiVG90YWwgU29saXRhcnkgYnkgVHlwZSIsDQogICAgICAgIGNvbC5uYW1lcyA9IGMoIlNvbGl0YXJ5IFR5cGUiLCAiVG90YWwgU29saXRhcnkgVHlwZSIpKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYygiaG92ZXIiLCAic3RyaXBlZCIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpKQ0KDQoNCmRmX3NvbGl0YXJ5ICU+JSANCiAgZ3JvdXBfYnkoZmFjaWxpdHkpICU+JSANCiAgc3VtbWFyaXNlKHRvdGFsX3NlZ3JlZ2F0aW9uID0gc3VtKHNlZ3JlZ2F0aW9uX2NvdW50KSkgJT4lIA0KICBhcnJhbmdlKGRlc2ModG90YWxfc2VncmVnYXRpb24pKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiVG90YWwgU29saXRhcnkgYnkgRmFjaWxpdHkiLA0KICAgICAgICBjb2wubmFtZXMgPSBjKCJGYWNpbGl0eSIsICJUb3RhbCBTb2xpdGFyeSBieSBGYWNpbGl0eSIpKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYygiaG92ZXIiLCAic3RyaXBlZCIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpKSAlPiUgDQogIHNjcm9sbF9ib3goaGVpZ2h0ID0gIjMwMHB4IikNCmBgYA0KDQojIyBGYWNldCBQbG90cyBvZiBTb2xpdGFyeSBieSBGYWNpbGl0eQ0KDQpgYGB7ciBzb2xpdGFyeS1mYWNldCwgZmlnLmhlaWdodD00MH0NCiMgR2VuZXJhdGluZyBhIGxpbmV0eXBlIHZlY3RvciBmb3IgdXNlIGluIHRoZSBwbG90DQpwbG90X2xpbmVzIDwtIGMoDQogICAgInNvbGlkIiwNCiAgICAic29saWQiLA0KICAgICJzb2xpZCIsDQogICAgInNvbGlkIiwNCiAgICAiZG90dGVkIg0KICAgICkNCg0KIyBVc2UgQ29sb3IgQnJld2VyIHRvIHNldCBjb2xvcnMgYW5kIG1vZGlmeQ0KIyB0aGUgbGFzdCBjb2xvciB0byBiZSBibGFjayBmb3IgdG90YWxzLg0KcGxvdF9jb2xvcnMgPC0gYnJld2VyLnBhbCg1LCAiUGFpcmVkIikNCnBsb3RfY29sb3JzWzVdIDwtICIjMDAwMDAwIg0KDQojIENyZWF0ZSBwbG90IGxhYmVscw0KcGxvdF9sYWJlbHMgPC0gYygNCiAgICAiQWRtaW5pc3RyYXRpdmUiLA0KICAgICJEaXNjaXBsaW5hcnkiLA0KICAgICJNZWRpY2FsIiwNCiAgICAiTWVudGFsIEhlYWx0aCIsDQogICAgIlRvdGFsIikNCg0KZGZfc29saXRhcnkgJT4lIA0KDQojIENhbGxpbmcgdGhlIHBsb3QgYW5kIGZvcm1hdHRpbmcNCiAgZ2dwbG90KGFlcyh4PWRhdGUsDQogICAgICAgICAgICAgeSA9IHNlZ3JlZ2F0aW9uX2NvdW50LA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gc2VncmVnYXRpb25fdHlwZSkpKw0KICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gc2VncmVnYXRpb25fdHlwZSksIHNpemUgPSAuNjUpICsNCiAgDQogICMgU2V0IHRoZSBjb2xvcg0KICBzY2FsZV9jb2xvcl9tYW51YWwoDQogIHZhbHVlcyA9IHBsb3RfY29sb3JzLA0KICBuYW1lID0gIlNvbGl0YXJ5IFR5cGU6IiwNCiAgbGFiZWxzID0gcGxvdF9sYWJlbHMpKw0KICANCiAgIyBTZXQgdGhlIGxpbmV0eXBlDQogIHNjYWxlX2xpbmV0eXBlX21hbnVhbCgNCiAgICB2YWx1ZXMgPSBwbG90X2xpbmVzLA0KICAgICAgbmFtZSA9ICJTb2xpdGFyeSBUeXBlOiIsDQogICAgbGFiZWxzID0gcGxvdF9sYWJlbHMpKw0KICANCiAgDQogIGxhYnModGl0bGUgPSAiUmVwb3J0ZWQgVXNlIG9mIFNvbGl0YXJ5IikrDQogIHlsYWIoIk51bWJlciBvZiBJbmRpdmlkdWFscyBQYWxjZWQgaW4gU29saXRhcnkiKSsNCiAgeGxhYigiRGF0ZSIpKw0KICB0aGVtZSgNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIg0KICAgICkrDQogICAgZmFjZXRfd3JhcCh+IGZhY2lsaXR5LCBuY29sPTMpDQpgYGANCg0KIyMgU29saXRhcnkgT3ZlciA2MCBEYXlzDQoNCmBgYHtyIHNvbGl0YXJ5LTYwLWZhY2V0fQ0KDQojIFVzZSBDb2xvciBCcmV3ZXIgdG8gc2V0IGNvbG9ycyBhbmQgbW9kaWZ5DQojIHRoZSBsYXN0IGNvbG9yIHRvIGJlIGJsYWNrIGZvciB0b3RhbHMuDQpwbG90X2NvbG9ycyA8LSBicmV3ZXIucGFsKDUsICJQYWlyZWQiKQ0KcGxvdF9jb2xvcnNbNV0gPC0gIiMwMDAwMDAiDQoNCiMgQ2FsbCB0aGUgZGF0YWZyYW1lIGFuZCBzZWxlY3QgY29scw0KZGZfMzI0ICU+JSANCiAgc2VsZWN0KGlkLA0KICAgICAgICAgZmFjaWxpdHksDQogICAgICAgICBzdGF0ZSwNCiAgICAgICAgIGRhdGUsDQogICAgICAgICBmYWNfb3BlcmF0b3IsDQogICAgICAgICBhZG1pbl9zZWdfNjBfaWNlLA0KICAgICAgICAgZGlzY19zZWdfNjBfaWNlKSAlPiUgDQogIGRyb3BfbmEoKSAlPiUgDQogIA0KICAjIE5lZWQgdGhlIHJvd3dpc2UgZnVuY3Rpb24gdG8gY29tcHV0ZSBhIHJvdy1hdC1hLXRpbWUNCiAgIyBpbiB0aGUgZm9sbG93aW5nIG11dGF0ZSBmdW5jdGlvbg0KICByb3d3aXNlKGlkKSAlPiUgDQogIA0KICAjIEdlbmVyYXRlIHRvdGFsIGNvbA0KICBtdXRhdGUodG90YWxfc2VnXzYwID0gc3VtKGNfYWNyb3NzKA0KICAgICAgIGFkbWluX3NlZ182MF9pY2U6DQogICAgICAgZGlzY19zZWdfNjBfaWNlDQogICkpKSAlPiUNCiAgDQogICMgTWFrZSB0aWR5IGFuZCBmaWx0ZXINCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBhZG1pbl9zZWdfNjBfaWNlOmRpc2Nfc2VnXzYwX2ljZSwNCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInNlZ3JlZ2F0aW9uXzYwX3R5cGUiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInNlZ3JlZ2F0aW9uXzYwX2NvdW50IikgJT4lDQogIGZpbHRlcihzZWdyZWdhdGlvbl82MF90eXBlICVpbiUgYygiYWRtaW5fc2VnXzYwX2ljZSIsICJkaXNjX3NlZ182MF9pY2UiKSYNCiAgICAgICAgICAgc2VncmVnYXRpb25fNjBfY291bnQgPiAwKSAlPiUNCiAgDQogICMgSW5pdGlhdGUgdGhlIHBsb3QgYW5kIHNvcnQgYnkgc3VtDQogIGdncGxvdChhZXMoeCA9IHNlZ3JlZ2F0aW9uXzYwX2NvdW50LA0KICAgICAgICAgICAgIHk9cmVvcmRlcihmYWNfb3BlcmF0b3IsIHNlZ3JlZ2F0aW9uXzYwX2NvdW50LCBzdW0pLA0KICAgICAgICAgICAgIGZpbGw9c2VncmVnYXRpb25fNjBfdHlwZSkpKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikrDQogIA0KICAjIFNldCB0aGUgY29sb3IgZmlsbA0KICBzY2FsZV9maWxsX2JyZXdlcih0eXBlID0gInF1YWwiLA0KICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gIlBhaXJlZCIsDQogICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiU2VncmVnYXRpb24gPiA2MCBUeXBlIiwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQWRtaW5pc3RyYXRpdmUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaXNjaXBsaW5hcnkiKSkrDQogIGxhYnModGl0bGU9ICJTZWdyZWdhdGlvbiA+IDYwIERheXMgYnkgRmFjaWxpdHkgT3BlcmF0b3IiLA0KICAgICAgICB4ID0gIlNlZ3JlZ2F0aW9uID4gNjAgRGF5cyBDb3VudCIsDQogICAgICAgIHkgPSAiRmFjaWxpdHkgT3BlcmF0b3IiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpDQpgYGANCg0KIyBVc2Ugb2YgRm9yY2UNCg0KIyMgU3VtbWFyeSBUYWJsZXMNCg0KYGBge3J9DQpkZl9mb3JjZSA8LSBkZl8zMjRfaW5jICU+JQ0KICANCiAgIyBTdWJzZXQgdGhlIGRmIHRvIG9ubHkgdGhlIHVzZWQgY29scw0KICBzZWxlY3QoaWQsIGZhY2lsaXR5LCBkYXRlLA0KICAgICAgIGltbWVkaWF0ZV91c2Vfb2ZfZm9yY2VfaW5jaWRlbnRzOg0KICAgICAgIHN0cmlwX3NlYXJjaGVzDQogICAgICAgKSAlPiUgDQogIA0KICAjIE5lZWQgdGhlIHJvd3dpc2UgZnVuY3Rpb24gdG8gY29tcHV0ZSBhIHJvdy1hdC1hLXRpbWUNCiAgIyBpbiB0aGUgZm9sbG93aW5nIG11dGF0ZSBmdW5jdGlvbg0KICByb3d3aXNlKGlkKSAlPiUgDQogIA0KICAjIENyZWF0ZSBhIG5ldyB0b3RhbCBjb2x1bW4NCiAgbXV0YXRlKHRvdGFsX3VzZV9vZl9mb3JjZSA9IHN1bShjX2Fjcm9zcygNCiAgICAgICBpbW1lZGlhdGVfdXNlX29mX2ZvcmNlX2luY2lkZW50czoNCiAgICAgICBzdHJpcF9zZWFyY2hlcw0KICApKSkgJT4lIA0KDQogICMgQ2FsbCBhIHJhbmdlIG9mIHRhYmxlIGNvbHVtbnMgYW5kIHBpdm90IGxvbmcNCiAgcGl2b3RfbG9uZ2VyKC4sDQogICAgICAgICAgICAgICBjb2xzPSAgaW1tZWRpYXRlX3VzZV9vZl9mb3JjZV9pbmNpZGVudHM6dG90YWxfdXNlX29mX2ZvcmNlLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAidXNlX29mX2ZvcmNlX3R5cGUiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInVzZV9vZl9mb3JjZV9jb3VudCIpICU+JQ0KICANCiAgIyBSZW1vdmUgTkEgdmFsdWVzDQogIGRyb3BfbmEoKSAlPiUgDQogIA0KICAjIEV4cGxpY2l0bHkgZGVmaW5lIGZhY3RvcnMNCiAgbXV0YXRlKHVzZV9vZl9mb3JjZV90eXBlID0gZmFjdG9yKHVzZV9vZl9mb3JjZV90eXBlLCBsZXZlbHMgPSBjKA0KICAgICJpbW1lZGlhdGVfdXNlX29mX2ZvcmNlX2luY2lkZW50cyIsDQogICAgImNhbGN1bGF0ZWRfdXNlX29mX2ZvcmNlX2luY2lkZW50cyIsDQogICAgInVzZXNfb2ZfZm9yY2Vfd2l0aF9jaGVtaWNhbF9hZ2VudHMiLA0KICAgICJpbmNpZGVudHNfd2hlcmVfbm9uX2xldGhhbF93ZWFwb25zX3dlcmVfdXNlZCIsDQogICAgIm51bWJlcl9vZl90aW1lc180XzVfcG9pbnRfcmVzdHJhaW50c193ZXJlX3VzZWQiLA0KICAgICJ1c2Vfb2ZfZm9yY2Vfd2l0aF9zZXJpb3VzX2luanVyeSIsDQogICAgInN0cmlwX3NlYXJjaGVzIiwNCiAgICAidG90YWxfdXNlX29mX2ZvcmNlIg0KICApKSkNCmBgYA0KDQpgYGB7cn0NCmRmX2ZvcmNlICU+JSANCiAgZ3JvdXBfYnkodXNlX29mX2ZvcmNlX3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGBUb3RhbCBVc2Ugb2YgRm9yY2UgYnkgVHlwZWAgPSBzdW0odXNlX29mX2ZvcmNlX2NvdW50KSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIlRvdGFsIFVzZSBvZiBGb3JjZSBieSBUeXBlIiwNCiAgICAgICAgY29sLm5hbWVzID0gYygiVXNlIG9mIEZvcmNlIFR5cGUiLCAiVG90YWwgVXNlIG9mIEZvcmNlIFR5cGUiKSkgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGMoImhvdmVyIiwgInN0cmlwZWQiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSkNCg0KDQpkZl9mb3JjZSAlPiUgDQogIGdyb3VwX2J5KGZhY2lsaXR5KSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbF91c2Vfb2ZfZm9yY2UgPSBzdW0odXNlX29mX2ZvcmNlX2NvdW50KSkgJT4lIA0KICBhcnJhbmdlKGRlc2ModG90YWxfdXNlX29mX2ZvcmNlKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIlRvdGFsIFVzZSBvZiBGb3JjZSBieSBGYWNpbGl0eSIsDQogICAgICAgIGNvbC5uYW1lcyA9IGMoIkZhY2lsaXR5IiwgIlRvdGFsIFVzZSBvZiBGb3JjZSBieSBGYWNpbGl0eSIpKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYygiaG92ZXIiLCAic3RyaXBlZCIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpKSAlPiUgDQogIHNjcm9sbF9ib3goaGVpZ2h0ID0gIjMwMHB4IikNCmBgYA0KDQojIyBGYWNldCBQbG90IG9mIFVzZSBvZiBGb3JjZSBieSBGYWNpbGl0eQ0KDQpgYGB7ciB1c2UtZm9yY2UtZmFjZXQsIGZpZy5oZWlnaHQ9NDB9DQojIEdlbmVyYXRpbmcgYSBsaW5ldHlwZSB2ZWN0b3IgZm9yIHVzZSBpbiB0aGUgcGxvdA0KcGxvdF9saW5lcyA8LSBjKA0KICAgICJzb2xpZCIsDQogICAgInNvbGlkIiwNCiAgICAic29saWQiLA0KICAgICJzb2xpZCIsDQogICAgInNvbGlkIiwNCiAgICAic29saWQiLA0KICAgICJzb2xpZCIsDQogICAgImRvdHRlZCINCiAgICApDQoNCiMgVXNlIENvbG9yIEJyZXdlciB0byBzZXQgY29sb3JzIGFuZCBtb2RpZnkNCiMgdGhlIGxhc3QgY29sb3IgdG8gYmUgYmxhY2sgZm9yIHRvdGFscy4NCnBsb3RfY29sb3JzIDwtIGJyZXdlci5wYWwoOCwgIlBhaXJlZCIpDQpwbG90X2NvbG9yc1s4XSA8LSAiIzAwMDAwMCINCg0KIyBDcmVhdGUgcGxvdCBsYWJlbHMNCnBsb3RfbGFiZWxzIDwtIGMoDQogICAgIkltbWVkaWF0ZSBVc2Ugb2YgRm9yY2UgSW5jaWRlbnRzIiwNCiAgICAiQ2FsY3VsYXRlZCBVc2Ugb2YgRm9yY2UgSW5jaWRlbnRzIiwNCiAgICAiVXNlcyBvZiBGb3JjZSB3aXRoIENoZW1pY2FsIEFnZW50cyIsDQogICAgIkluY2lkZW50cyBXaGVyZSBOb24tTGV0aGFsIFdlYXBvbnMgV2VyZSBVc2VkIiwNCiAgICAiVGltZXMgNC81IFBvaW50IFJlc3RyYWludHMgVXNlZCIsDQogICAgIlVzZSBvZiBGb3JjZSBXaXRoIFNlcmlvdXMgSW5qdXJ5IiwNCiAgICAiU3RyaXAgU2VhcmNoZXMiLA0KICAgICJUb3RhbCBEaXNjaXBsaW5hcnkiKQ0KDQpkZl9mb3JjZSAlPiUgDQogIA0KICAjIENhbGxpbmcgdGhlIHBsb3QgYW5kIGZvcm1hdHRpbmcNCiAgZ2dwbG90KGFlcyh4PWRhdGUsIHkgPSB1c2Vfb2ZfZm9yY2VfY291bnQsIGxpbmV0eXBlPXVzZV9vZl9mb3JjZV90eXBlKSkrDQogIGdlb21fbGluZShhZXMoY29sb3IgPSB1c2Vfb2ZfZm9yY2VfdHlwZSksIHNpemUgPSAuNjUpICsNCiAgDQogICMgc2V0dGluZyB0aGUgbGluZXR5cGUNCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKA0KICAgIHZhbHVlcyA9IHBsb3RfbGluZXMsDQogICAgbGFiZWxzID0gcGxvdF9sYWJlbHMsDQogICAgbmFtZSA9ICJVc2Ugb2YgRm9yY2UgVHlwZToiLA0KICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKG5yb3cgPSA4KQ0KICAgICkrDQogIA0KICAjIFNldHRpbmcgdGhlIGNvbG9yDQogIHNjYWxlX2NvbG9yX21hbnVhbCgNCiAgdmFsdWVzID0gcGxvdF9jb2xvcnMsDQogIGxhYmVscyA9IHBsb3RfbGFiZWxzLA0KICBuYW1lID0gIlVzZSBvZiBGb3JjZSBUeXBlOiIsDQogICkrDQoNCiAgbGFicyh0aXRsZSA9ICJEaXNjaXBsaW5hcnkiKSsNCiAgeWxhYigiTnVtYmVyIG9mIERpc2NpcGxpbmFyeSBJbmZyYWN0aW9ucyIpKw0KICB4bGFiKCJEYXRlIikrDQogIHRoZW1lKA0KICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iDQogICAgKSsNCg0KICAgICMgU2V0IHRoZSBsZWdlbmQgdG8gbXVsdGlwbGUgcm93cw0KICBndWlkZXMoY29sID0gZ3VpZGVfbGVnZW5kKG5yb3cgPTgpKSsNCiAgDQogICMgV3JhcA0KICBmYWNldF93cmFwKH4gZmFjaWxpdHksIG5jb2w9MykNCmBgYA0KDQojIFNleHVhbCBBYnVzZSBhbmQgQXNzYXVsdA0KDQojIyBBbGxlZ2F0aW9ucw0KDQojIyMgU3VtbWFyeSBUYWJsZXMNCg0KYGBge3J9DQpkZl9zZXhfYWxsZWcgPC0gZGZfMzI0X2luYyAlPiUNCiAgDQogICMgU3Vic2V0IHRoZSBkZiB0byBvbmx5IHRoZSB1c2VkIGNvbHMNCiAgc2VsZWN0KGlkLCBmYWNpbGl0eSwgZGF0ZSwNCiAgICAgICBzZXh1YWxfYWJ1c2VfYWxsZWdhdGlvbnNfZGV0YWluZWVfb25fZGV0YWluZWU6DQogICAgICAgc2V4dWFsX2FidXNlX2FsbGVnYXRpb25zX2RldGFpbmVlX29uX3N0YWZmX2NvbnRyYWN0b3Jfdm9sdW50ZWVyXzI5DQogICAgICAgKSAlPiUgDQogIA0KICAjIE5lZWQgdGhlIHJvd3dpc2UgZnVuY3Rpb24gdG8gY29tcHV0ZSBhIHJvdy1hdC1hLXRpbWUNCiAgIyBpbiB0aGUgZm9sbG93aW5nIG11dGF0ZSBmdW5jdGlvbg0KICByb3d3aXNlKGlkKSAlPiUgDQogIA0KICAjIENyZWF0ZSBhIG5ldyB0b3RhbCBjb2x1bW4NCiAgbXV0YXRlKHRvdGFsX3NleHVhbF9hYnVzZV9hbGxlZ2F0aW9ucyA9IHN1bShjX2Fjcm9zcygNCiAgICAgICBzZXh1YWxfYWJ1c2VfYWxsZWdhdGlvbnNfZGV0YWluZWVfb25fZGV0YWluZWU6DQogICAgICAgc2V4dWFsX2FidXNlX2FsbGVnYXRpb25zX2RldGFpbmVlX29uX3N0YWZmX2NvbnRyYWN0b3Jfdm9sdW50ZWVyXzI5DQogICkpKSAlPiUgDQoNCiAgIyBDYWxsIGEgcmFuZ2Ugb2YgdGFibGUgY29sdW1ucyBhbmQgcGl2b3QgbG9uZw0KICBwaXZvdF9sb25nZXIoLiwNCiAgICAgICAgICAgICAgIGNvbHM9ICBzZXh1YWxfYWJ1c2VfYWxsZWdhdGlvbnNfZGV0YWluZWVfb25fZGV0YWluZWU6dG90YWxfc2V4dWFsX2FidXNlX2FsbGVnYXRpb25zLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAic2V4dWFsX2FidXNlX2FsbGVnYXRpb25zX3R5cGUiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInNleHVhbF9hYnVzZV9hbGxlZ2F0aW9uc19jb3VudCIpICU+JQ0KICANCiAgIyBSZW1vdmUgTkENCiAgZHJvcF9uYSgpICU+JSANCiAgDQogICMgRXhwbGljaXRseSBkZWZpbmUgZmFjdG9yIGxldmVscw0KICBtdXRhdGUoc2V4dWFsX2FidXNlX2FsbGVnYXRpb25zX3R5cGUgPSBmYWN0b3Ioc2V4dWFsX2FidXNlX2FsbGVnYXRpb25zX3R5cGUsIGxldmVscyA9IGMoDQogICAgInNleHVhbF9hYnVzZV9hbGxlZ2F0aW9uc19kZXRhaW5lZV9vbl9kZXRhaW5lZSIsDQogICAgInNleHVhbF9hYnVzZV9hbGxlZ2F0aW9uc19pbm1hdGVfb25fZGV0YWluZWUiLA0KICAgICJzZXh1YWxfYWJ1c2VfYWxsZWdhdGlvbnNfZGV0YWluZWVfb25faW5tYXRlIiwNCiAgICAic2V4dWFsX2FidXNlX2FsbGVnYXRpb25zX2RldGFpbmVlX29uX3N0YWZmX2NvbnRyYWN0b3Jfdm9sdW50ZWVyIiwNCiAgICAic2V4dWFsX2FidXNlX2FsbGVnYXRpb25zX2RldGFpbmVlX29uX3N0YWZmX2NvbnRyYWN0b3Jfdm9sdW50ZWVyXzI5IiwNCiAgICAidG90YWxfc2V4dWFsX2FidXNlX2FsbGVnYXRpb25zIg0KICApKSkNCmBgYA0KDQpgYGB7cn0NCmRmX3NleF9hbGxlZyAlPiUgDQogIGdyb3VwX2J5KHNleHVhbF9hYnVzZV9hbGxlZ2F0aW9uc190eXBlKSAlPiUgDQogIHN1bW1hcmlzZShgU2V4dWFsIEFidXNlIGFuZCBBc3NhdWx0IEFsbGVnYXRpb25zIGJ5IFR5cGVgID0gc3VtKHNleHVhbF9hYnVzZV9hbGxlZ2F0aW9uc19jb3VudCkpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJUb3RhbCBTZXh1YWwgQWJ1c2UgYW5kIEFzc2F1bHQgQWxsZWdhdGlvbnMgYnkgVHlwZSIsDQogICAgICAgIGNvbC5uYW1lcyA9IGMoIkFsbGVnYXRpb24gVHlwZSIsICJUb3RhbCBBbGxlZ2F0aW9uIFR5cGUiKSkgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGMoImhvdmVyIiwgInN0cmlwZWQiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSkNCg0KDQpkZl9zZXhfYWxsZWcgJT4lIA0KICBncm91cF9ieShmYWNpbGl0eSkgJT4lIA0KICBzdW1tYXJpc2UodG90YWxfc2V4dWFsX2FidXNlX2FsbGVnYXRpb25zID0gc3VtKHNleHVhbF9hYnVzZV9hbGxlZ2F0aW9uc19jb3VudCkpICU+JSANCiAgYXJyYW5nZShkZXNjKHRvdGFsX3NleHVhbF9hYnVzZV9hbGxlZ2F0aW9ucykpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJUb3RhbCBTZXh1YWwgQWJ1c2UgYW5kIEFzc2F1bHQgQWxsZWdhdGlvbnMgYnkgRmFjaWxpdHkiLA0KICAgICAgICBjb2wubmFtZXMgPSBjKCJGYWNpbGl0eSIsICJUb3RhbCBBbGxlZ2F0aW9ucyBieSBGYWNpbGl0eSIpKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYygiaG92ZXIiLCAic3RyaXBlZCIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpKSAlPiUgDQogIHNjcm9sbF9ib3goaGVpZ2h0ID0gIjMwMHB4IikNCmBgYA0KDQojIyMgRmFjZXQgUGxvdCBvZiBTZXh1YWwgQWJ1c2UgYW5kIEFzc2F1bHQgQWxsZWdhdGlvbnMgYnkgRmFjaWxpdHkNCg0KYGBge3Igc2V4dWFsLWFidXNlLWFsbGVnYXRpb24tZmFjZXQsIGZpZy5oZWlnaHQ9NDB9DQojIEdlbmVyYXRpbmcgYSBsaW5ldHlwZSB2ZWN0b3IgZm9yIHVzZSBpbiB0aGUgcGxvdA0KcGxvdF9saW5lcyA8LSBjKA0KICAgICJzb2xpZCIsDQogICAgInNvbGlkIiwNCiAgICAic29saWQiLA0KICAgICJzb2xpZCIsDQogICAgInNvbGlkIiwNCiAgICAiZG90dGVkIg0KICAgICkNCg0KIyBVc2UgQ29sb3IgQnJld2VyIHRvIHNldCBjb2xvcnMgYW5kIG1vZGlmeQ0KIyB0aGUgbGFzdCBjb2xvciB0byBiZSBibGFjayBmb3IgdG90YWxzLg0KcGxvdF9jb2xvcnMgPC0gYnJld2VyLnBhbCg2LCAiUGFpcmVkIikNCnBsb3RfY29sb3JzWzZdIDwtICIjMDAwMDAwIg0KDQojIENyZWF0ZSBwbG90IGxhYmVscw0KcGxvdF9sYWJlbHMgPC0gYygNCiAgICAiU2V4dWFsIEFidXNlIEFsbGVnYXRpb25zIC0gRGV0YWluZWUgb24gRGV0YWluZWUiLA0KICAgICJTZXh1YWwgQWJ1c2UgQWxsZWdhdGlvbnMgLSBJbm1hdGUgb24gRGV0YWluZWUiLA0KICAgICJTZXh1YWwgQWJ1c2UgQWxsZWdhdGlvbnMgLSBEZXRhaW5lZSBvbiBJbm1hdGUiLA0KICAgICJTZXh1YWwgQWJ1c2UgQWxsZWdhdGlvbnMgLSBTdGFmZi9Db250cmFjdG9yL1ZvbHVudGVlciBvbiBEZXRhaW5lZSIsDQogICAgIk51bWJlciBvZiBTZXh1YWwgQWJ1c2UgQWxsZWdhdGlvbnMgLSBEZXRhaW5lZSBvbiBTdGFmZi9Db250cmFjdG9yL1ZvbHVudGVlciIsDQogICAgIlRvdGFsIFNleHVhbCBBYnVzZSBBbGxlZ2F0aW9ucyIpDQoNCmRmX3NleF9hbGxlZyAlPiUgDQogICMgQ2FsbGluZyB0aGUgcGxvdCBhbmQgZm9ybWF0dGluZw0KICBnZ3Bsb3QoYWVzKHg9ZGF0ZSwgeSA9IHNleHVhbF9hYnVzZV9hbGxlZ2F0aW9uc19jb3VudCwgbGluZXR5cGU9c2V4dWFsX2FidXNlX2FsbGVnYXRpb25zX3R5cGUpKSsNCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IHNleHVhbF9hYnVzZV9hbGxlZ2F0aW9uc190eXBlKSxzaXplPS42NSkgKw0KICANCiAgIyBTZXQgdGhlIGxpbmV0eXBlDQogIHNjYWxlX2xpbmV0eXBlX21hbnVhbCgNCiAgICB2YWx1ZXMgPSBwbG90X2xpbmVzLA0KICAgIGxhYmVscyA9IHBsb3RfbGFiZWxzLA0KICAgIG5hbWUgPSAiU2V4dWFsIEFidXNlIEFsbGVnYXRpb24gVHlwZToiLA0KICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKG5yb3cgPSA2KQ0KICAgICkrDQogIA0KICAjIFNldCB0aGUgY29sb3INCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHBsb3RfY29sb3JzLA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gcGxvdF9sYWJlbHMsDQogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlNleHVhbCBBYnVzZSBBbGxlZ2F0aW9uIFR5cGU6IikrDQoNCiAgbGFicyh0aXRsZSA9ICJTZXh1YWwgQWJ1c2UgQWxsZWdhdGlvbnMiKSsNCiAgeWxhYigiTnVtYmVyIG9mIEFsbGVnYXRpb25zIikrDQogIHhsYWIoIkRhdGUiKSsNCiAgdGhlbWUoDQogICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSINCiAgICApKw0KDQogICAgIyBTZXQgdGhlIGxlZ2VuZCB0byBtdWx0aXBsZSByb3dzDQogIGd1aWRlcyhjb2wgPSBndWlkZV9sZWdlbmQobnJvdyA9OCkpKw0KICANCiAgIyBXcmFwDQogIGZhY2V0X3dyYXAofiBmYWNpbGl0eSwgbmNvbD0zKQ0KYGBgDQoNCiMjIFN1YnN0YW50aWF0ZWQgQWxsZWdhdGlvbnMNCg0KIyMjIFN1bW1hcnkgVGFibGVzDQoNCmBgYHtyfQ0KZGZfc2V4X2FsbGVnX3N1YiA8LSBkZl8zMjRfaW5jICU+JQ0KICANCiAgIyBTdWJzZXQgdGhlIGRmIHRvIG9ubHkgdGhlIHVzZWQgY29scw0KICBzZWxlY3QoaWQsIGZhY2lsaXR5LCBkYXRlLA0KICAgICAgIHNleHVhbF9hYnVzZV9hbGxlZ2F0aW9uc19kZXRhaW5lZV9vbl9kZXRhaW5lZV8yOg0KICAgICAgIHNleHVhbF9hYnVzZV9hbGxlZ2F0aW9uc19kZXRhaW5lZV9vbl9zdGFmZl9jb250cmFjdG9yX3ZvbHVudGVlcl8zNA0KICAgICAgICkgJT4lIA0KICANCiAgIyBOZWVkIHRoZSByb3d3aXNlIGZ1bmN0aW9uIHRvIGNvbXB1dGUgYSByb3ctYXQtYS10aW1lDQogICMgaW4gdGhlIGZvbGxvd2luZyBtdXRhdGUgZnVuY3Rpb24NCiAgcm93d2lzZShpZCkgJT4lIA0KICANCiAgIyBDcmVhdGUgYSBuZXcgdG90YWwgY29sdW1uDQogIG11dGF0ZSh0b3RhbF9zZXh1YWxfYWJ1c2VfYWxsZWdhdGlvbnMgPSBzdW0oY19hY3Jvc3MoDQogICAgICAgc2V4dWFsX2FidXNlX2FsbGVnYXRpb25zX2RldGFpbmVlX29uX2RldGFpbmVlXzI6DQogICAgICAgc2V4dWFsX2FidXNlX2FsbGVnYXRpb25zX2RldGFpbmVlX29uX3N0YWZmX2NvbnRyYWN0b3Jfdm9sdW50ZWVyXzM0DQogICkpKSAlPiUgDQoNCiAgIyBDYWxsIGEgcmFuZ2Ugb2YgdGFibGUgY29sdW1ucyBhbmQgcGl2b3QgbG9uZw0KICBwaXZvdF9sb25nZXIoLiwNCiAgICAgICAgICAgICAgIGNvbHM9ICBzZXh1YWxfYWJ1c2VfYWxsZWdhdGlvbnNfZGV0YWluZWVfb25fZGV0YWluZWVfMjp0b3RhbF9zZXh1YWxfYWJ1c2VfYWxsZWdhdGlvbnMsDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJzZXh1YWxfYWJ1c2Vfc3Vic3RhbnRpYXRlZF90eXBlIiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJzZXh1YWxfYWJ1c2Vfc3Vic3RhbnRpYXRlZF9jb3VudCIpICU+JQ0KICANCiAgIyBSZW1vdmUgTkEgdmFsdWVzDQogIGRyb3BfbmEoKSAlPiUgDQogIA0KICAjIEV4cGxpY2l0bHkgc2V0IGZhY3RvciBsZXZlbHMNCiAgbXV0YXRlKHNleHVhbF9hYnVzZV9zdWJzdGFudGlhdGVkX3R5cGU9IGZhY3RvcihzZXh1YWxfYWJ1c2Vfc3Vic3RhbnRpYXRlZF90eXBlLCBsZXZlbHMgPWMoDQogICAgInNleHVhbF9hYnVzZV9hbGxlZ2F0aW9uc19kZXRhaW5lZV9vbl9kZXRhaW5lZV8yIiwNCiAgICAic2V4dWFsX2FidXNlX2FsbGVnYXRpb25zX2lubWF0ZV9vbl9kZXRhaW5lZV8yIiwNCiAgICAic2V4dWFsX2FidXNlX2FsbGVnYXRpb25zX2RldGFpbmVlX29uX2lubWF0ZV8yIiwNCiAgICAic2V4dWFsX2FidXNlX2FsbGVnYXRpb25zX3N0YWZmX2NvbnRyYWN0b3Jfdm9sdW50ZWVyX29uX2RldGFpbmVlIiwNCiAgICAic2V4dWFsX2FidXNlX2FsbGVnYXRpb25zX2RldGFpbmVlX29uX3N0YWZmX2NvbnRyYWN0b3Jfdm9sdW50ZWVyXzM0IiwNCiAgICAidG90YWxfc2V4dWFsX2FidXNlX2FsbGVnYXRpb25zIg0KICApKSkNCmBgYA0KDQpgYGB7cn0NCmRmX3NleF9hbGxlZ19zdWIgJT4lIA0KICBncm91cF9ieShzZXh1YWxfYWJ1c2Vfc3Vic3RhbnRpYXRlZF90eXBlKSAlPiUgDQogIHN1bW1hcmlzZShgU2V4dWFsIEFidXNlIGFuZCBBc3NhdWx0IEFsbGVnYXRpb25zIFN1YnN0YW50aWF0ZWQgYnkgVHlwZWAgPSBzdW0oc2V4dWFsX2FidXNlX3N1YnN0YW50aWF0ZWRfY291bnQpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiVG90YWwgU3Vic3RhbnRpYXRlZCBTZXh1YWwgQWJ1c2UgYW5kIEFzc2F1bHQgQWxsZWdhdGlvbnMgYnkgVHlwZSIsDQogICAgICAgIGNvbC5uYW1lcyA9IGMoIlN1YnN0YW50aWF0ZWQgQWxsZWdhdGlvbiBUeXBlIiwgIlRvdGFsIFN1YnN0YW50aWF0ZWQgQWxsZWdhdGlvbiBUeXBlIikpICU+JSANCiAga2FibGVfc3R5bGluZyhjKCJob3ZlciIsICJzdHJpcGVkIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIikpDQoNCg0KZGZfc2V4X2FsbGVnX3N1YiAlPiUgDQogIGdyb3VwX2J5KGZhY2lsaXR5KSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbF9zZXh1YWxfYWJ1c2Vfc3Vic3RhbnRpYXRlZCA9IHN1bShzZXh1YWxfYWJ1c2Vfc3Vic3RhbnRpYXRlZF9jb3VudCkpICU+JSANCiAgYXJyYW5nZShkZXNjKHRvdGFsX3NleHVhbF9hYnVzZV9zdWJzdGFudGlhdGVkKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIlRvdGFsIFN1YnN0YW50aWF0ZWQgU2V4dWFsIEFidXNlIGFuZCBBc3NhdWx0IEFsbGVnYXRpb25zIGJ5IEZhY2lsaXR5IiwNCiAgICAgICAgY29sLm5hbWVzID0gYygiRmFjaWxpdHkiLCAiVG90YWwgU3Vic3RhbnRpYXRlZCBBbGxlZ2F0aW9ucyBieSBGYWNpbGl0eSIpKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYygiaG92ZXIiLCAic3RyaXBlZCIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpKSAlPiUgDQogIHNjcm9sbF9ib3goaGVpZ2h0ID0gIjMwMHB4IikNCmBgYA0KDQojIyMgRmFjZXQgUGxvdCBvZiBTdWJzdGFudGlhdGVkIFNleHVhbCBBYnVzZSBhbmQgQXNzYXVsdCBBbGxlZ2F0aW9ucw0KDQpgYGB7ciBzZXh1YWwtYWJ1c2Utc3Vic3RhbnRpYXRlZC1mYWNldCwgZmlnLmhlaWdodD00MH0NCiMgR2VuZXJhdGluZyBhIGxpbmV0eXBlIHZlY3RvciBmb3IgdXNlIGluIHRoZSBwbG90DQpwbG90X2xpbmVzIDwtIGMoDQogICAgInNvbGlkIiwNCiAgICAic29saWQiLA0KICAgICJzb2xpZCIsDQogICAgInNvbGlkIiwNCiAgICAic29saWQiLA0KICAgICJkb3R0ZWQiDQogICAgKQ0KDQojIFVzZSBDb2xvciBCcmV3ZXIgdG8gc2V0IGNvbG9ycyBhbmQgbW9kaWZ5DQojIHRoZSBsYXN0IGNvbG9yIHRvIGJlIGJsYWNrIGZvciB0b3RhbHMuDQpwbG90X2NvbG9ycyA8LSBicmV3ZXIucGFsKDYsICJQYWlyZWQiKQ0KcGxvdF9jb2xvcnNbNl0gPC0gIiMwMDAwMDAiDQoNCiMgQ3JlYXRlIHRoZSBsYWJlbHMNCnBsb3RfbGFiZWxzIDwtIGMoDQogICAgIlNleHVhbCBBYnVzZSBBbGxlZ2F0aW9ucyAtIERldGFpbmVlIG9uIERldGFpbmVlIiwNCiAgICAiU2V4dWFsIEFidXNlIEFsbGVnYXRpb25zIC0gSW5tYXRlIG9uIERldGFpbmVlIiwNCiAgICAiU2V4dWFsIEFidXNlIEFsbGVnYXRpb25zIC0gRGV0YWluZWUgb24gSW5tYXRlIiwNCiAgICAiU2V4dWFsIEFidXNlIEFsbGVnYXRpb25zIC0gU3RhZmYvQ29udHJhY3Rvci9Wb2x1bnRlZXIgb24gRGV0YWluZWUiLA0KICAgICJOdW1iZXIgb2YgU2V4dWFsIEFidXNlIEFsbGVnYXRpb25zIC0gRGV0YWluZWUgb24gU3RhZmYvQ29udHJhY3Rvci9Wb2x1bnRlZXIiLA0KICAgICJUb3RhbCBTZXh1YWwgQWJ1c2UgQWxsZWdhdGlvbnMiKQ0KDQpkZl9zZXhfYWxsZWdfc3ViICU+JSANCiAgDQogICMgQ2FsbGluZyB0aGUgcGxvdCBhbmQgZm9ybWF0dGluZw0KICBnZ3Bsb3QoYWVzKHg9ZGF0ZSwgeSA9IHNleHVhbF9hYnVzZV9zdWJzdGFudGlhdGVkX2NvdW50LCBsaW5ldHlwZT1zZXh1YWxfYWJ1c2Vfc3Vic3RhbnRpYXRlZF90eXBlKSkrDQogIGdlb21fbGluZShhZXMoY29sb3IgPSBzZXh1YWxfYWJ1c2Vfc3Vic3RhbnRpYXRlZF90eXBlKSxzaXplPS42NSkgKw0KICANCiAgIyBTZXQgdGhlIGxpbmV0eXBlDQogIHNjYWxlX2xpbmV0eXBlX21hbnVhbCgNCiAgICB2YWx1ZXMgPSBwbG90X2xpbmVzLA0KICAgIGxhYmVscyA9IHBsb3RfbGFiZWxzLA0KICAgIG5hbWUgPSAiU2V4dWFsIEFidXNlIEFsbGVnYXRpb24gVHlwZToiLA0KICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKG5yb3cgPSA2KQ0KICAgICkrDQogIA0KICAjIFNldCB0aGUgY29sb3INCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHBsb3RfY29sb3JzLA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gcGxvdF9sYWJlbHMsDQogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlNleHVhbCBBYnVzZSBBbGxlZ2F0aW9uIFR5cGU6IikrDQoNCiAgbGFicyh0aXRsZSA9ICJTZXh1YWwgQWJ1c2UgQWxsZWdhdGlvbnMgU3Vic3RhbnRpYXRlZCIpKw0KICB5bGFiKCJOdW1iZXIgb2YgQWxsZWdhdGlvbnMiKSsNCiAgeGxhYigiRGF0ZSIpKw0KICB0aGVtZSgNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIg0KICAgICkrDQoNCiAgIyBTZXQgdGhlIGxlZ2VuZCB0byBtdWx0aXBsZSByb3dzDQogIGd1aWRlcyhjb2wgPSBndWlkZV9sZWdlbmQobnJvdyA9OCkpKw0KICANCiAgIyBXcmFwDQogIGZhY2V0X3dyYXAofiBmYWNpbGl0eSwgbmNvbD0zKQ0KYGBgDQoNCiMgTWVkaWNhbA0KDQojIyBNZWRpY2FsIE9ic2VydmF0aW9uDQoNCmBgYHtyIG1lZGljYWwtbWVudGFsLW9ic2VydmF0aW9uLWZhY2V0LCBmaWcuaGVpZ2h0PTQwfQ0KIyBHZW5lcmF0aW5nIGEgbGluZXR5cGUgdmVjdG9yIGZvciB1c2UgaW4gdGhlIHBsb3QNCnBsb3RfbGluZXMgPC0gYygNCiAgICAic29saWQiLA0KICAgICJzb2xpZCIsDQogICAgImRvdHRlZCINCiAgICApDQoNCiMgVXNlIENvbG9yIEJyZXdlciB0byBzZXQgY29sb3JzDQpwbG90X2NvbG9ycyA8LSBicmV3ZXIucGFsKDMsICJQYWlyZWQiKQ0KcGxvdF9jb2xvcnNbM10gPC0gIiMwMDAwMDAiDQoNCiMgQ3JlYXRlIHBsb3QgbGFiZWxzDQpwbG90X2xhYmVscyA8LSBjKA0KICAgICJEZXRhaW5lZXMgaW4gTWVkaWNhbCBPYnNlcnZhdGlvbiIsDQogICAgIkRldGFpbmVlcyBpbiBNZW50YWwgSGVhbHRoIE9ic2VydmF0aW9uIiwNCiAgICAiVG90YWwgSW5kaXZpZHVhbHMgaW4gTWVkaWNhbCBvciBNZW50YWwgSGVhbHRoIE9ic2VydmF0aW9uIikNCg0KZGZfMzI0X2luYyAlPiUNCiAgDQogICMgU3Vic2V0IHRoZSBkZiB0byBvbmx5IHRoZSB1c2VkIGNvbHMNCiAgc2VsZWN0KGlkLCBmYWNpbGl0eSwgZGF0ZSwNCiAgICAgICBkZXRhaW5lZXNfaW5fbWVkaWNhbF9vYnNlcnZhdGlvbjoNCiAgICAgICBkZXRhaW5lZXNfaW5fbWVudGFsX2hlYWx0aF9vYnNlcnZhdGlvbg0KICAgICAgICkgJT4lIA0KICANCiAgIyBOZWVkIHRoZSByb3d3aXNlIGZ1bmN0aW9uIHRvIGNvbXB1dGUgYSByb3ctYXQtYS10aW1lDQogICMgaW4gdGhlIGZvbGxvd2luZyBtdXRhdGUgZnVuY3Rpb24NCiAgcm93d2lzZShpZCkgJT4lIA0KICANCiAgIyBDcmVhdGUgYSBuZXcgdG90YWwgY29sdW1uDQogIG11dGF0ZSh0b3RhbF9tZW50YWxfbWVkaWNhbF9vYnNlcnZhdGlvbiA9IHN1bShjX2Fjcm9zcygNCiAgICAgICBkZXRhaW5lZXNfaW5fbWVkaWNhbF9vYnNlcnZhdGlvbjoNCiAgICAgICBkZXRhaW5lZXNfaW5fbWVudGFsX2hlYWx0aF9vYnNlcnZhdGlvbg0KICApKSkgJT4lIA0KDQogICMgQ2FsbCBhIHJhbmdlIG9mIHRhYmxlIGNvbHVtbnMgYW5kIHBpdm90IGxvbmcNCiAgcGl2b3RfbG9uZ2VyKC4sDQogICAgICAgICAgICAgICBjb2xzPSAgZGV0YWluZWVzX2luX21lZGljYWxfb2JzZXJ2YXRpb246dG90YWxfbWVudGFsX21lZGljYWxfb2JzZXJ2YXRpb24sDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJtZWRpY2FsX21lbnRhbF9vYnNlcnZhdGlvbl90eXBlIiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJtZWRpY2FsX21lbnRhbF9vYnNlcnZhdGlvbl9jb3VudCIpICU+JQ0KICANCiAgIyBSZW1vdmUgTkEgdmFsdWVzDQogIGRyb3BfbmEoKSAlPiUgDQogIA0KICAjIEV4cGxpY2l0bHkgc2V0IGZhY3RvciBsZXZlbHMNCiAgbXV0YXRlKG1lZGljYWxfbWVudGFsX29ic2VydmF0aW9uX3R5cGUgPSBmYWN0b3IobWVkaWNhbF9tZW50YWxfb2JzZXJ2YXRpb25fdHlwZSwgbGV2ZWxzID0gYygNCiAgICAiZGV0YWluZWVzX2luX21lZGljYWxfb2JzZXJ2YXRpb24iLA0KICAgICJkZXRhaW5lZXNfaW5fbWVudGFsX2hlYWx0aF9vYnNlcnZhdGlvbiIsDQogICAgInRvdGFsX21lbnRhbF9tZWRpY2FsX29ic2VydmF0aW9uIg0KICApKSkgJT4lIA0KICANCiAgIyBDYWxsaW5nIHRoZSBwbG90IGFuZCBmb3JtYXR0aW5nDQogIGdncGxvdChhZXMoeD1kYXRlLCB5ID0gbWVkaWNhbF9tZW50YWxfb2JzZXJ2YXRpb25fY291bnQsIGxpbmV0eXBlPW1lZGljYWxfbWVudGFsX29ic2VydmF0aW9uX3R5cGUpKSsNCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IG1lZGljYWxfbWVudGFsX29ic2VydmF0aW9uX3R5cGUpLHNpemU9LjY1KSArDQogIA0KICAjIFNldCB0aGUgbGluZXR5cGUNCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKA0KICAgIHZhbHVlcyA9IHBsb3RfbGluZXMsDQogICAgbGFiZWxzID0gcGxvdF9sYWJlbHMsDQogICAgbmFtZSA9ICJPYnNlcnZhdGlvbiBUeXBlOiIsDQogICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQobnJvdyA9IDMpDQogICAgKSsNCiAgDQogICMgU2V0IHRoZSBjb2xvcg0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gcGxvdF9jb2xvcnMsDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBwbG90X2xhYmVscywNCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiT2JzZXJ2YXRpb24gVHlwZToiLCkrDQoNCiAgbGFicyh0aXRsZSA9ICJNZWRpY2FsIGFuZCBNZW50YWwgSGVhbHRoIE9ic2VydmF0aW9uIikrDQogIHlsYWIoIk51bWJlciBvZiBJbmRpdmlkdWFscyBpbiBPYnNlcnZhdGlvbiIpKw0KICB4bGFiKCJEYXRlIikrDQogIHRoZW1lKA0KICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iDQogICAgKSsNCg0KICAjIFNldCB0aGUgbGVnZW5kIHRvIG11bHRpcGxlIHJvd3MNCiAgZ3VpZGVzKGNvbCA9IGd1aWRlX2xlZ2VuZChucm93ID0zKSkrDQogIA0KICAjIFdyYXANCiAgZmFjZXRfd3JhcCh+IGZhY2lsaXR5LCBuY29sPTMpDQogIA0KYGBgDQoNCiMjIEluZmVjdGlvbnMgRGlzZWFzZQ0KDQpgYGB7ciBpbmZlY3Rpb3VzLWRpc2Vhc2UtZmFjZXQsIGZpZy5oZWlnaHQ9NDB9DQojIEdlbmVyYXRpbmcgYSBsaW5ldHlwZSB2ZWN0b3IgZm9yIHVzZSBpbiB0aGUgcGxvdA0KcGxvdF9saW5lcyA8LSBjKA0KICAgICJzb2xpZCIsDQogICAgInNvbGlkIg0KICAgICkNCg0KIyBVc2UgQ29sb3IgQnJld2VyIHRvIHNldCBjb2xvcnMNCnBsb3RfY29sb3JzIDwtIGJyZXdlci5wYWwoMiwgIlBhaXJlZCIpDQoNCiMgQ3JlYXRlIHBsb3QgbGFiZWxzDQpwbG90X2xhYmVscyA8LSBjKA0KICAgICJJbmZlY3Rpb3VzIERpc2Vhc2UgUmVwb3J0ZWQiLA0KICAgICJJbmZlY3Rpb3VzIERpc2Vhc2UgQ29uZmlybWVkIikNCg0KZGZfMzI0X2luYyAlPiUNCiAgDQogICMgU3Vic2V0IHRoZSBkZiB0byBvbmx5IHRoZSB1c2VkIGNvbHMNCiAgc2VsZWN0KGlkLCBmYWNpbGl0eSwgZGF0ZSwNCiAgICAgICBpbmZlY3Rpb3VzX2Rpc2Vhc2VfcmVwb3J0ZWQ6DQogICAgICAgaW5mZWN0aW9uc19kaXNlYXNlX2NvbmZpcm1lZA0KICAgICAgICkgJT4lIA0KICANCiAgIyBOZWVkIHRoZSByb3d3aXNlIGZ1bmN0aW9uIHRvIGNvbXB1dGUgYSByb3ctYXQtYS10aW1lDQogICMgaW4gdGhlIGZvbGxvd2luZyBtdXRhdGUgZnVuY3Rpb24NCiAgcm93d2lzZShpZCkgJT4lIA0KICANCiAgIyAjIENyZWF0ZSBhIG5ldyB0b3RhbCBjb2x1bW4NCiAgIyAjIEluIHRoaXMgY2FzZSBub3QgdXNlZA0KICAjIG11dGF0ZSh0b3RhbF9pbmZlY3Rpb25zX2Rpc2Vhc2VfcmVwb3J0X2NvbmZpcm1lZCA9IHN1bShjX2Fjcm9zcygNCiAgIyAgICAgIGluZmVjdGlvdXNfZGlzZWFzZV9yZXBvcnRlZDoNCiAgIyAgICAgIGluZmVjdGlvbnNfZGlzZWFzZV9jb25maXJtZWQNCiAgIyApKSkgJT4lIA0KDQogICMgQ2FsbCBhIHJhbmdlIG9mIHRhYmxlIGNvbHVtbnMgYW5kIHBpdm90IGxvbmcNCiAgcGl2b3RfbG9uZ2VyKC4sDQogICAgICAgICAgICAgICBjb2xzPSAgaW5mZWN0aW91c19kaXNlYXNlX3JlcG9ydGVkOmluZmVjdGlvbnNfZGlzZWFzZV9jb25maXJtZWQsDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJpbmZlY3Rpb3VzX2Rpc2Vhc2VfdHlwZSIsDQogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiaW5mZWN0aW91c19kaXNlYXNlX2NvdW50IikgJT4lDQogIA0KICAjIFJlbW92ZSBOQSB2YWx1ZXMNCiAgZHJvcF9uYSgpICU+JSANCiAgDQogICMgRXhwbGljaXRseSBkZWZpbmUgZmFjdG9yIGxldmVscw0KICBtdXRhdGUoaW5mZWN0aW91c19kaXNlYXNlX3R5cGUgPSBmYWN0b3IoaW5mZWN0aW91c19kaXNlYXNlX3R5cGUsIGxldmVscyA9IGMoDQogICAgImluZmVjdGlvdXNfZGlzZWFzZV9yZXBvcnRlZCIsDQogICAgImluZmVjdGlvbnNfZGlzZWFzZV9jb25maXJtZWQiDQogICkpKSAlPiUgDQogIA0KICAjIENhbGxpbmcgdGhlIHBsb3QgYW5kIGZvcm1hdHRpbmcNCiAgZ2dwbG90KGFlcyh4PWRhdGUsIHkgPSBpbmZlY3Rpb3VzX2Rpc2Vhc2VfY291bnQsIGxpbmV0eXBlPWluZmVjdGlvdXNfZGlzZWFzZV90eXBlKSkrDQogIGdlb21fbGluZShhZXMoY29sb3IgPSBpbmZlY3Rpb3VzX2Rpc2Vhc2VfdHlwZSksc2l6ZT0uNjUpICsNCiAgDQogICMgU2V0IHRoZSBsaW5ldHlwZQ0KICBzY2FsZV9saW5ldHlwZV9tYW51YWwoDQogICAgdmFsdWVzID0gcGxvdF9saW5lcywNCiAgICBsYWJlbHMgPSBwbG90X2xhYmVscywNCiAgICBuYW1lID0gIkNhdGVnb3J5OiIsDQogICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQobnJvdyA9IDIpDQogICAgKSsNCiAgDQogICMgU2V0IHRoZSBjb2xvcg0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gcGxvdF9jb2xvcnMsDQogICAgbGFiZWxzID0gcGxvdF9sYWJlbHMsDQogICAgbmFtZSA9ICJDYXRlZ29yeToiKSsNCg0KICBsYWJzKHRpdGxlID0gIkluZmVjdGlvdXMgRGlzZWFzZXMgUmVwb3J0ZWQgYW5kIENvbmZpcm1lZCIpKw0KICB5bGFiKCJDb3VudCIpKw0KICB4bGFiKCJEYXRlIikrDQogIHRoZW1lKA0KICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iDQogICAgKSsNCg0KICAjIFNldCB0aGUgbGVnZW5kIHRvIG11bHRpcGxlIHJvd3MNCiAgZ3VpZGVzKGNvbCA9IGd1aWRlX2xlZ2VuZChucm93ID0zKSkrDQogIA0KICAjIFdyYXANCiAgZmFjZXRfd3JhcCh+IGZhY2lsaXR5LCBuY29sPTMpDQogIA0KICANCmBgYA0KDQojIyBNZWRpY2FsIGFuZCBNZW50YWwgSGVhbHRoIFJlZmVycmFscw0KDQpgYGB7ciByZWZlcnJhbHMtZmFjZXQsIGZpZy5oZWlnaHQ9NDB9DQojIEdlbmVyYXRpbmcgYSBsaW5ldHlwZSB2ZWN0b3IgZm9yIHVzZSBpbiB0aGUgcGxvdA0KcGxvdF9saW5lcyA8LSBjKA0KICAgICJzb2xpZCIsDQogICAgInNvbGlkIiwNCiAgICAic29saWQiLA0KICAgICJzb2xpZCIsDQogICAgImRvdHRlZCINCiAgICApDQoNCiMgVXNlIENvbG9yIEJyZXdlciB0byBzZXQgY29sb3JzDQpwbG90X2NvbG9ycyA8LSBicmV3ZXIucGFsKDUsICJQYWlyZWQiKQ0KcGxvdF9jb2xvcnNbNV0gPC0gIiMwMDAwMDAiDQoNCiMgQ3JlYXRlIHBsb3QgbGFiZWxzDQpwbG90X2xhYmVscyA8LSBjKA0KICAgICJPdXRzaWRlIE1lZGljYWwgUmVmZXJyYWxzIiwNCiAgICAiRGV0YWluZWVzIFRyYW5zcG9ydGVkIHRvIE9mZi1TaXRlIEhvc3BpdGFscyBmb3IgRW1lcmdlbmN5IFJlYXNvbnMiLA0KICAgICJBZG1pc3Npb25zIHRvIE9mZi1TaXRlIEhvc3BpdGFscyBmb3IgTWVkaWNhbCBSZWFzb25zIiwNCiAgICAiQWRtaXNzaW9ucyB0byBPZmYtU2l0ZSBIb3NwaXRhbHMgZm9yIE1lbnRhbCBIZWFsdGggUmVhc29ucyIsDQogICAgIlRvdGFsIFJlZmVycmFscyIpDQoNCg0KZGZfMzI0X2luYyAlPiUNCiAgDQogICMgU3Vic2V0IHRoZSBkZiB0byBvbmx5IHRoZSB1c2VkIGNvbHMNCiAgc2VsZWN0KGlkLCBmYWNpbGl0eSwgZGF0ZSwNCiAgICAgICBvdXRzaWRlX21lZGljYWxfcmVmZXJyYWxzOg0KICAgICAgIGFkbWlzc2lvbnNfdG9fb2ZmX3NpdGVfaG9zcGl0YWxzX2Zvcl9tZW50YWxfaGVhbHRoX3JlYXNvbnMNCiAgICAgICApICU+JSANCiAgDQogICMgTmVlZCB0aGUgcm93d2lzZSBmdW5jdGlvbiB0byBjb21wdXRlIGEgcm93LWF0LWEtdGltZQ0KICAjIGluIHRoZSBmb2xsb3dpbmcgbXV0YXRlIGZ1bmN0aW9uDQogIHJvd3dpc2UoaWQpICU+JSANCiAgDQogICMgQ3JlYXRlIGEgbmV3IHRvdGFsIGNvbHVtbg0KICBtdXRhdGUodG90YWxfcmVmZXJyYWxzID0gc3VtKGNfYWNyb3NzKA0KICAgICAgIG91dHNpZGVfbWVkaWNhbF9yZWZlcnJhbHM6DQogICAgICAgYWRtaXNzaW9uc190b19vZmZfc2l0ZV9ob3NwaXRhbHNfZm9yX21lbnRhbF9oZWFsdGhfcmVhc29ucw0KICApKSkgJT4lIA0KDQogICMgQ2FsbCBhIHJhbmdlIG9mIHRhYmxlIGNvbHVtbnMgYW5kIHBpdm90IGxvbmcNCiAgcGl2b3RfbG9uZ2VyKC4sDQogICAgICAgICAgICAgICBjb2xzPSAgb3V0c2lkZV9tZWRpY2FsX3JlZmVycmFsczp0b3RhbF9yZWZlcnJhbHMsDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJyZWZlcnJhbF90eXBlIiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJyZWZlcnJhbF9jb3VudCIpICU+JQ0KICANCiAgIyBSZW1vdmUgTkEgdmFsdWVzDQogIGRyb3BfbmEoKSAlPiUgDQogIA0KICAjIEV4cGxpY2l0bHkgZGVmaW5lIGZhY3RvciBsZXZlbHMNCiAgbXV0YXRlKHJlZmVycmFsX3R5cGU9IGZhY3RvcihyZWZlcnJhbF90eXBlLCBsZXZlbHMgPSBjKA0KICAgICJvdXRzaWRlX21lZGljYWxfcmVmZXJyYWxzIiwNCiAgICAiZGV0YWluZWVzX3RyYW5zcG9ydGVkX3RvX29mZl9zaXRlX2hvc3BpdGFsc19mb3JfZW1lcmdlbmN5X2NhcmUiLA0KICAgICJhZG1pc3Npb25zX3RvX29mZl9zaXRlX2hvc3BpdGFsc19mb3JfbWVkaWNhbF9yZWFzb25zIiwNCiAgICAiYWRtaXNzaW9uc190b19vZmZfc2l0ZV9ob3NwaXRhbHNfZm9yX21lbnRhbF9oZWFsdGhfcmVhc29ucyIsDQogICAgInRvdGFsX3JlZmVycmFscyINCiAgKSkpICU+JSANCiAgDQogIA0KICAjIENhbGxpbmcgdGhlIHBsb3QgYW5kIGZvcm1hdHRpbmcNCiAgZ2dwbG90KGFlcyh4PWRhdGUsIHkgPSByZWZlcnJhbF9jb3VudCwgbGluZXR5cGU9cmVmZXJyYWxfdHlwZSkpKw0KICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gcmVmZXJyYWxfdHlwZSksc2l6ZT0uNjUpICsNCiAgDQogICMgU2V0IHRoZSBsaW5ldHlwZQ0KICBzY2FsZV9saW5ldHlwZV9tYW51YWwoDQogICAgdmFsdWVzID0gcGxvdF9saW5lcywNCiAgICBsYWJlbHMgPSBwbG90X2xhYmVscywNCiAgICBuYW1lID0gIlJlZmVycmFsIFR5cGU6IiwNCiAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZChucm93ID0gNSkNCiAgICApKw0KICANCiAgIyBTZXQgdGhlIGNvbG9yDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBwbG90X2NvbG9ycywNCiAgICBsYWJlbHMgPSBwbG90X2xhYmVscywNCiAgICBuYW1lID0gIlJlZmVycmFsIFR5cGU6IikrDQoNCiAgbGFicyh0aXRsZSA9ICJNZWRpY2FsIGFuZCBNZW50YWwgSGVhbHRoIFJlZmVycmFscyIpKw0KICB5bGFiKCJOdW1iZXIgb2YgUmVmZXJyYWxzIikrDQogIHhsYWIoIkRhdGUiKSsNCiAgdGhlbWUoDQogICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSINCiAgICApKw0KDQogICMgU2V0IHRoZSBsZWdlbmQgdG8gbXVsdGlwbGUgcm93cw0KICBndWlkZXMoY29sID0gZ3VpZGVfbGVnZW5kKG5yb3cgPTUpKSsNCiAgDQogICMgV3JhcA0KICBmYWNldF93cmFwKH4gZmFjaWxpdHksIG5jb2w9MykNCmBgYA0KDQojIyBTaWNrIENhbGwgUmVxdWVzdHMgYW5kIEVuY291bnRlcnMNCg0KDQoNCmBgYHtyfQ0KZGZfc2lja19jYWxsIDwtIGRmXzMyNF9pbmMgJT4lDQogIA0KICAjIFNlbGVjdCBhIHN1YnNldCBvZiBjb2x1bW5zIHRvIHdvcmsgd2l0aA0KICBzZWxlY3QoaWQsDQogICAgICAgICBmYWNpbGl0eSwNCiAgICAgICAgIGRhdGUsDQogICAgICAgICBzaWNrX2NhbGxfcmVxdWVzdHMsDQogICAgICAgICBzaWNrX2NhbGxfZW5jb3VudGVycykgJT4lIA0KICANCiAgIyBOZWVkIHRoZSByb3d3aXNlIGZ1bmN0aW9uIHRvIGNvbXB1dGUgYSByb3ctYXQtYS10aW1lDQogICMgaW4gdGhlIGZvbGxvd2luZyBtdXRhdGUgZnVuY3Rpb24NCiAgcm93d2lzZShpZCkgJT4lIA0KICANCiAgIyBDcmVhdGUgbmV3IHRvdGFsIGNvbHVtbg0KICBtdXRhdGUodG90YWxfc2lja19jYWxsID0gc2lja19jYWxsX3JlcXVlc3RzLA0KICAgICAgICAgc2lja19jYWxsX2VuY291bnRlcnMpICU+JSANCiAgDQogICMgVGlkeQ0KICBwaXZvdF9sb25nZXIoLiwNCiAgICAgICAgICAgICAgIGNvbHM9IHNpY2tfY2FsbF9yZXF1ZXN0czoNCiAgICAgICAgIHNpY2tfY2FsbF9lbmNvdW50ZXJzLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAic2lja19jYWxsX3R5cGUiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInNpY2tfY2FsbF9jb3VudCIpICU+JSANCiAgDQogICMgUmVtb3ZlIE5BDQogIGRyb3BfbmEoKSAlPiUgDQogIA0KICAjIEV4cGxpY2l0bHkgc2V0IGZhY3RvciBsZXZlbHMNCiAgbXV0YXRlKHNpY2tfY2FsbF90eXBlID0gZmFjdG9yKHNpY2tfY2FsbF90eXBlLCBsZXZlbHMgPSBjKA0KICAgICJzaWNrX2NhbGxfcmVxdWVzdHMiLA0KICAgICJzaWNrX2NhbGxfZW5jb3VudGVycyIsDQogICAgInRvdGFsX3NpY2tfY2FsbCINCiAgKSkpDQpgYGANCg0KYGBge3J9DQpkZl9zaWNrX2NhbGwgJT4lIA0KICBncm91cF9ieShzaWNrX2NhbGxfdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoYFRvdGFsIFNpY2sgQ2FsbCBieSBUeXBlYCA9IHN1bShzaWNrX2NhbGxfY291bnQpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiVG90YWwgU2ljayBDYWxsIGJ5IFR5cGUiLA0KICAgICAgICBjb2wubmFtZXMgPSBjKCJUeXBlIiwgIlRvdGFsIikpICU+JSANCiAga2FibGVfc3R5bGluZyhjKCJob3ZlciIsICJzdHJpcGVkIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIikpDQoNCmRmX3NpY2tfY2FsbCAlPiUgDQogIGdyb3VwX2J5KGZhY2lsaXR5KSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbF9zaWNrX2NhbGwgPSBzdW0oc2lja19jYWxsX2NvdW50KSkgJT4lIA0KICBhcnJhbmdlKGRlc2ModG90YWxfc2lja19jYWxsKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIlRvdGFsIFNpY2sgQ2FsbCBSZXF1ZXN0cy9FbmNvdW50ZXJzIGJ5IEZhY2lsaXR5IiwNCiAgICAgICAgY29sLm5hbWVzID0gYygiRmFjaWxpdHkiLCAiVG90YWwiKSkgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGMoImhvdmVyIiwgInN0cmlwZWQiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSkgJT4lIA0KICBzY3JvbGxfYm94KGhlaWdodCA9ICIzMDBweCIpDQpgYGANCg0KDQoNCg0KDQpgYGB7ciBzaWNrLWNhbGxzLCBmaWcuaGVpZ2h0PTQwfQ0KIyBHZW5lcmF0aW5nIGEgbGluZXR5cGUgdmVjdG9yIGZvciB1c2UgaW4gdGhlIHBsb3QNCnBsb3RfbGluZXMgPC0gYygNCiAgICAic29saWQiLA0KICAgICJzb2xpZCIsDQogICAgImRvdHRlZCINCiAgICApDQoNCiMgVXNlIENvbG9yIEJyZXdlciB0byBzZXQgY29sb3JzDQpwbG90X2NvbG9ycyA8LSBicmV3ZXIucGFsKDMsICJQYWlyZWQiKQ0KcGxvdF9jb2xvcnNbM10gPC0gIiMwMDAwMDAiDQoNCiMgQ3JlYXRlIGxhYmVscw0KcGxvdF9sYWJlbHMgPC0gYygNCiAgICAiU2ljayBDYWxsIFJlcXVlc3RzIiwNCiAgICAiU2ljayBDYWxsIEVuY291bnRlcnMiLA0KICAgICJUb3RhbCBTaWNrIENhbGxzIikNCg0KZGZfMzI0X2luYyAlPiUNCiAgDQogICMgU3Vic2V0IHRoZSBkZiB0byBvbmx5IHRoZSB1c2VkIGNvbHMNCiAgc2VsZWN0KGlkLCBmYWNpbGl0eSwgZGF0ZSwNCiAgICAgICBzaWNrX2NhbGxfcmVxdWVzdHM6DQogICAgICAgc2lja19jYWxsX2VuY291bnRlcnMNCiAgICAgICApICU+JSANCiAgDQogICMgTmVlZCB0aGUgcm93d2lzZSBmdW5jdGlvbiB0byBjb21wdXRlIGEgcm93LWF0LWEtdGltZQ0KICAjIGluIHRoZSBmb2xsb3dpbmcgbXV0YXRlIGZ1bmN0aW9uDQogIHJvd3dpc2UoaWQpICU+JSANCiAgDQogICMgQ3JlYXRlIGEgbmV3IHRvdGFsIGNvbHVtbg0KICBtdXRhdGUodG90YWxfc2lja19jYWxscyA9IHN1bShjX2Fjcm9zcygNCiAgICAgICBzaWNrX2NhbGxfcmVxdWVzdHM6DQogICAgICAgc2lja19jYWxsX2VuY291bnRlcnMNCiAgKSkpICU+JSANCg0KICAjIENhbGwgYSByYW5nZSBvZiB0YWJsZSBjb2x1bW5zIGFuZCBwaXZvdCBsb25nDQogIHBpdm90X2xvbmdlciguLA0KICAgICAgICAgICAgICAgY29scz0gIHNpY2tfY2FsbF9yZXF1ZXN0czp0b3RhbF9zaWNrX2NhbGxzLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAic2lja19jYWxsX3R5cGUiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInNpY2tfY2FsbF9jb3VudCIpICU+JQ0KICANCiAgIyBSZW1vdmUgTkEgdmFsdWVzDQogIGRyb3BfbmEoKSAlPiUgDQogIA0KICAjIEV4cGxpY2l0bHkgZGVmaW5lIGZhY3RvciBsZXZlbHMNCiAgbXV0YXRlKHNpY2tfY2FsbF90eXBlID0gZmFjdG9yKHNpY2tfY2FsbF90eXBlLCBsZXZlbHMgPSBjKA0KICAgICJzaWNrX2NhbGxfcmVxdWVzdHMiLA0KICAgICJzaWNrX2NhbGxfZW5jb3VudGVycyIsDQogICAgInRvdGFsX3NpY2tfY2FsbHMiDQogICkpKSAlPiUgDQogIA0KICAjIENhbGxpbmcgdGhlIHBsb3QgYW5kIGZvcm1hdHRpbmcNCiAgZ2dwbG90KGFlcyh4PWRhdGUsIHkgPSBzaWNrX2NhbGxfY291bnQsIGxpbmV0eXBlPXNpY2tfY2FsbF90eXBlKSkrDQogIGdlb21fbGluZShhZXMoY29sb3IgPSBzaWNrX2NhbGxfdHlwZSksc2l6ZT0uNjUpICsNCiAgDQogICMgU2V0IHRoZSBsaW5ldHlwZQ0KICBzY2FsZV9saW5ldHlwZV9tYW51YWwoDQogICAgdmFsdWVzID0gcGxvdF9saW5lcywNCiAgICBsYWJlbHMgPSBwbG90X2xhYmVscywNCiAgICBuYW1lID0gIlNpY2sgQ2FsbCBUeXBlOiIsDQogICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQobnJvdyA9IDMpDQogICAgKSsNCiAgDQogICMgU2V0IHRoZSBjb2xvcg0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gcGxvdF9jb2xvcnMsDQogICAgbGFiZWxzID0gcGxvdF9sYWJlbHMsDQogICAgbmFtZSA9ICJTaWNrIENhbGwgVHlwZToiKSsNCg0KICBsYWJzKHRpdGxlID0gIlNpY2sgQ2FsbHMiKSsNCiAgeWxhYigiTnVtYmVyIG9mIFNpY2sgQ2FsbHMiKSsNCiAgeGxhYigiRGF0ZSIpKw0KICB0aGVtZSgNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIg0KICAgICkrDQoNCiAgIyBTZXQgdGhlIGxlZ2VuZCB0byBtdWx0aXBsZSByb3dzDQogIGd1aWRlcyhjb2wgPSBndWlkZV9sZWdlbmQobnJvdyA9MykpKw0KICANCiAgIyBXcmFwDQogIGZhY2V0X3dyYXAofiBmYWNpbGl0eSwgbmNvbD0zKQ0KYGBgDQoNCiMjIFN1aWNpZGUgQXR0ZW1wdHMgYW5kIFdhdGNoZXMNCg0KVGhlIGZvbGxvd2luZyBzaG93cyBTdWljaWRlIEF0dGVtcHRzIGFuZCBTdWljaWRlIFdhdGNoZXMgYmFzZWQgb24gdGhlIHN0YXR1cyBvZiB0aGUgZGF0YSBhcyBvZiBgciBTeXMuRGF0ZSgpYC4gVGhlIG51bWJlcnMgYXJlIHN1YmplY3QgdG8gY2hhbmdlLg0KDQpgYGB7cn0NCmRmX3N1aWNpZGUgPC0gZGZfMzI0X2luYyAlPiUNCiAgDQogICMgU2VsZWN0IGEgc3Vic2V0IG9mIGNvbHVtbnMgdG8gd29yayB3aXRoDQogIHNlbGVjdChpZCwNCiAgICAgICAgIGZhY2lsaXR5LA0KICAgICAgICAgZGF0ZSwNCiAgICAgICAgIHN1aWNpZGVfYXR0ZW1wdHNfb3Jfc2VsZl9oYXJtLA0KICAgICAgICAgc3VpY2lkZV93YXRjaGVzX2NvbnN0YW50X3dhdGNoX21lbnRhbF9oZWFsdGhfb2JzZXJ2YXRpb24pICU+JSANCiAgDQogICMgTmVlZCB0aGUgcm93d2lzZSBmdW5jdGlvbiB0byBjb21wdXRlIGEgcm93LWF0LWEtdGltZQ0KICAjIGluIHRoZSBmb2xsb3dpbmcgbXV0YXRlIGZ1bmN0aW9uDQogIHJvd3dpc2UoaWQpICU+JSANCiAgDQogICMgQ3JlYXRlIG5ldyB0b3RhbCBjb2x1bW4NCiAgbXV0YXRlKHRvdGFsX3N1aWNpZGUgPSBzdWljaWRlX2F0dGVtcHRzX29yX3NlbGZfaGFybSArDQogICAgICAgICBzdWljaWRlX3dhdGNoZXNfY29uc3RhbnRfd2F0Y2hfbWVudGFsX2hlYWx0aF9vYnNlcnZhdGlvbikgJT4lIA0KICANCiAgIyBUaWR5DQogIHBpdm90X2xvbmdlciguLA0KICAgICAgICAgICAgICAgY29scz0gc3VpY2lkZV9hdHRlbXB0c19vcl9zZWxmX2hhcm06DQogICAgICAgICAgICAgICB0b3RhbF9zdWljaWRlLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAic3VpY2lkZV90eXBlIiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJzdWljaWRlX2NvdW50IikgJT4lIA0KICANCiAgIyBSZW1vdmUgTkENCiAgZHJvcF9uYSgpICU+JSANCiAgDQogICMgRXhwbGljaXRseSBzZXQgZmFjdG9yIGxldmVscw0KICBtdXRhdGUoc2VncmVnYXRpb25fdHlwZSA9IGZhY3RvcihzdWljaWRlX3R5cGUsIGxldmVscyA9IGMoDQogICAgInN1aWNpZGVfYXR0ZW1wdHNfb3Jfc2VsZl9oYXJtIiwNCiAgICAic3VpY2lkZV93YXRjaGVzX2NvbnN0YW50X3dhdGNoX21lbnRhbF9oZWFsdGhfb2JzZXJ2YXRpb24iLA0KICAgICJ0b3RhbF9zdWljaWRlIg0KICApKSkNCmBgYA0KDQpgYGB7cn0NCmRmX3N1aWNpZGUgJT4lIA0KICBncm91cF9ieShzdWljaWRlX3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGBUb3RhbCBTdWljaWRlIEF0dGVtcHQgb3IgV2F0Y2ggYnkgVHlwZWAgPSBzdW0oc3VpY2lkZV9jb3VudCkpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJUb3RhbCBTdWljaWRlIEF0dGVtcHQgb3IgV2F0Y2ggYnkgVHlwZSIsDQogICAgICAgIGNvbC5uYW1lcyA9IGMoIlR5cGUiLCAiVG90YWwiKSkgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGMoImhvdmVyIiwgInN0cmlwZWQiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSkNCg0KZGZfc3VpY2lkZSAlPiUgDQogIGdyb3VwX2J5KGZhY2lsaXR5KSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbF9zdWljaWRlID0gc3VtKHN1aWNpZGVfY291bnQpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyh0b3RhbF9zdWljaWRlKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIlRvdGFsIFN1aWNpZGUgQXR0ZW1wdCBvciBXYXRjaCBieSBGYWNpbGl0eSIsDQogICAgICAgIGNvbC5uYW1lcyA9IGMoIkZhY2lsaXR5IiwgIlRvdGFsIikpICU+JSANCiAga2FibGVfc3R5bGluZyhjKCJob3ZlciIsICJzdHJpcGVkIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIikpICU+JSANCiAgc2Nyb2xsX2JveChoZWlnaHQgPSAiMzAwcHgiKQ0KYGBgDQoNCg0KYGBge3Igc3VpY2lkZS1mYWNldCwgZmlnLmhlaWdodD00MH0NCg0KIyBVc2UgQ29sb3IgQnJld2VyIHRvIHNldCBjb2xvcnMgYW5kIG1vZGlmeQ0KIyB0aGUgbGFzdCBjb2xvciB0byBiZSBibGFjayBmb3IgdG90YWxzLg0KcGxvdF9jb2xvcnMgPC0gYnJld2VyLnBhbCgyLCAiUGFpcmVkIikNCg0KIyBDcmVhdGUgcGxvdCBsYWJlbHMNCnBsb3RfbGFiZWxzIDwtIGMoDQogICAgICAiU3VpY2lkZSBBdHRlbXB0cyBvciBTZWxmIEhhcm0iLA0KICAgICAgIlN1aWNpZGUgV2F0Y2hlcy9Db25zdGFudCBXYXRjaC9NZW50YWwgSGVhbHRoIE9ic2VydmF0aW9uIikNCg0KZGZfMzI0X2luYyAlPiUNCiAgDQogICMgU3Vic2V0IHRoZSBkZiB0byBvbmx5IHRoZSB1c2VkIGNvbHMNCiAgc2VsZWN0KGlkLCBmYWNpbGl0eSwgZGF0ZSwNCiAgICAgICBzdWljaWRlX2F0dGVtcHRzX29yX3NlbGZfaGFybSwNCiAgICAgICBzdWljaWRlX3dhdGNoZXNfY29uc3RhbnRfd2F0Y2hfbWVudGFsX2hlYWx0aF9vYnNlcnZhdGlvbg0KICAgICAgICkgJT4lIA0KICBkcm9wX25hKCkgJT4lIA0KIA0KICAjIENhbGwgYSByYW5nZSBvZiB0YWJsZSBjb2x1bW5zIGFuZCBwaXZvdCBsb25nDQogIHBpdm90X2xvbmdlciguLA0KICAgICAgICAgICAgICAgY29scz0gIGMoc3VpY2lkZV9hdHRlbXB0c19vcl9zZWxmX2hhcm0sDQogICAgICAgc3VpY2lkZV93YXRjaGVzX2NvbnN0YW50X3dhdGNoX21lbnRhbF9oZWFsdGhfb2JzZXJ2YXRpb24pLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAic3VpY2lkZV90eXBlIiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJzdWljaWRlX2NvdW50IikgJT4lIA0KICANCiAgIyBSZW1vdmUgTkEgdmFsdWVzDQogIGRyb3BfbmEoKSAlPiUgDQogIA0KICAjIEV4cGxpY2l0bHkgZGVmaW5lIGZhY3RvciBsZXZlbHMNCiAgbXV0YXRlKHN1aWNpZGVfdHlwZSA9IGZhY3RvcihzdWljaWRlX3R5cGUsIGxldmVscyA9IGMoDQogICAgInN1aWNpZGVfYXR0ZW1wdHNfb3Jfc2VsZl9oYXJtIiwNCiAgICAic3VpY2lkZV93YXRjaGVzX2NvbnN0YW50X3dhdGNoX21lbnRhbF9oZWFsdGhfb2JzZXJ2YXRpb24iDQogICkpKSAlPiUgDQogIA0KICAjIENhbGxpbmcgdGhlIHBsb3QgYW5kIGZvcm1hdHRpbmcNCiAgZ2dwbG90KGFlcyh4PWRhdGUsIHkgPSBzdWljaWRlX2NvdW50KSkrDQogIGdlb21fbGluZShhZXMoY29sb3I9c3VpY2lkZV90eXBlKSwgc2l6ZSA9IC42NSkgKw0KICANCiAgIyBTZXQgdGhlIGNvbG9yDQogIHNjYWxlX2NvbG9yX21hbnVhbCgNCiAgICB2YWx1ZXMgPSBwbG90X2NvbG9ycywNCiAgICBsYWJlbHMgPSBwbG90X2xhYmVscywNCiAgICBuYW1lID0gIlR5cGU6Ig0KICAgICkrDQogIA0KICBsYWJzKHRpdGxlID0gIlN1aWNpZGUgQXR0ZW1wdHMgYW5kIFdhdGNoZXMiKSsNCiAgeWxhYigiTnVtYmVyIG9mIEF0dGVtcHRzIG9yIFdhdGNoZXMiKSsNCiAgeGxhYigiRGF0ZSIpKw0KICB0aGVtZSgNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIg0KICAgICkrDQogICMgU2V0IHRoZSBsZWdlbmQgdG8gbXVsdGlwbGUgcm93cw0KICBndWlkZXMoY29sID0gZ3VpZGVfbGVnZW5kKG5yb3cgPTUpKSsNCiAgDQogICMgV3JhcA0KICBmYWNldF93cmFwKH4gZmFjaWxpdHksIG5jb2wgPSAzKQ0KDQoNCmBgYA0KDQojIyBIdW5nZXIgU3RyaWtlcw0KDQpgYGB7ciBodW5nZXItc3RyaWtlLXN1bW1hcnl9DQpkZl8zMjRfaW5jICU+JQ0KICANCiAgIyBTdWJzZXQgdGhlIGRmIHRvIG9ubHkgdGhlIHVzZWQgY29scw0KICBzZWxlY3QoaWQsIGZhY2lsaXR5LCBkYXRlLCBodW5nZXJfc3RyaWtlcykgJT4lIA0KDQogIGdyb3VwX2J5KGZhY2lsaXR5KSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbF9odW5nZXJfc3RyaWtlID0gc3VtKGh1bmdlcl9zdHJpa2VzKSkgJT4lIA0KICBhcnJhbmdlKGRlc2ModG90YWxfaHVuZ2VyX3N0cmlrZSkpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJUb3RhbCBIdW5nZXIgU3RyaWtlcyBieSBGYWNpbGl0eSIsDQogICAgICAgIGNvbC5uYW1lcyA9IGMoIkZhY2lsaXR5IiwgIlRvdGFsIEh1bmdlciBTdHJpa2VzIikpICU+JSANCiAga2FibGVfc3R5bGluZyhjKCJob3ZlciIsICJzdHJpcGVkIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIikpICU+JSANCiAgc2Nyb2xsX2JveChoZWlnaHQgPSAiMzAwcHgiKQ0KYGBgDQoNCg0KDQoNCmBgYHtyIGh1bmdlci1zdHJpa2UtZmFjZXQsIGZpZy5oZWlnaHQ9NDB9DQojIFVzZSBDb2xvciBCcmV3ZXIgdG8gc2V0IGNvbG9ycyBhbmQgbW9kaWZ5DQojIHRoZSBsYXN0IGNvbG9yIHRvIGJlIGJsYWNrIGZvciB0b3RhbHMuDQpwbG90X2NvbG9ycyA8LSBicmV3ZXIucGFsKDIsICJQYWlyZWQiKQ0KDQpkZl8zMjRfaW5jICU+JQ0KICANCiAgIyBTdWJzZXQgdGhlIGRmIHRvIG9ubHkgdGhlIHVzZWQgY29scw0KICBzZWxlY3QoaWQsIGZhY2lsaXR5LCBkYXRlLA0KICAgICAgIGh1bmdlcl9zdHJpa2VzDQogICAgICAgKSAlPiUgDQogIGRyb3BfbmEoKSAlPiUgDQogDQoNCiAgIyBDYWxsaW5nIHRoZSBwbG90IGFuZCBmb3JtYXR0aW5nDQogIGdncGxvdChhZXMoeD1kYXRlLCB5ID0gaHVuZ2VyX3N0cmlrZXMpKSsNCiAgZ2VvbV9saW5lKHNpemUgPSAuNjUpICsNCiAgDQogICMgc2NhbGVfY29sb3JfbWFudWFsKA0KICAjICAgdmFsdWVzID0gcGxvdF9jb2xvcnMsDQogICMgICBsYWJlbHMgPSBjKA0KICAjICAgICAiU3VpY2lkZSBBdHRlbXB0cyBvciBTZWxmIEhhcm0iLA0KICAjICAgICAiU3VpY2lkZSBXYXRjaGVzL0NvbnN0YW50IFdhdGNoL01lbnRhbCBIZWFsdGggT2JzZXJ2YXRpb24iDQogICMgICAgICksDQogICMgICBuYW1lID0gIlR5cGU6Ig0KICAjICAgKSsNCiAgIyANCiAgbGFicyh0aXRsZSA9ICJIdW5nZXIgU3RyaWtlcyIpKw0KICB5bGFiKCJOdW1iZXIgb2YgSHVuZ2VyIFN0cmlrZXMiKSsNCiAgeGxhYigiRGF0ZSIpKw0KICB0aGVtZSgNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIg0KICAgICkrDQogIA0KICAjIFNldCB0aGUgbGVnZW5kIHRvIG11bHRpcGxlIHJvd3MNCiAgZ3VpZGVzKGNvbCA9IGd1aWRlX2xlZ2VuZChucm93ID01KSkrDQogIA0KICAjIFdyYXANCiAgZmFjZXRfd3JhcCh+IGZhY2lsaXR5LCBuY29sID0gMykNCmBgYA0KDQojIENhdXNlIG9mIERlYXRoDQoNCiMjIFN1aWNpZGUgYXMgQ2F1c2Ugb2YgRGVhdGgNCg0KQmFyIHBsb3Qgb2YgSUNFIGFuZCBub24tSUNFIGRlYXRocyBieSBzdWljaWRlIHBsb3R0ZWQgYnkgZmFjaWxpdHkgYXMgb2YgYHIgU3lzLkRhdGUoKWAuDQoNCmBgYHtyIHN1aWNpZGUtY29kLXBsb3R9DQpkZl8zMjQgJT4lIA0KICBzZWxlY3QoaWQsDQogICAgICAgICBmYWNpbGl0eSwNCiAgICAgICAgIHN0YXRlLA0KICAgICAgICAgZGF0ZSwNCiAgICAgICAgIGZhY19vcGVyYXRvciwNCiAgICAgICAgIGNvZF9zdWljaWRlX2ljZSwNCiAgICAgICAgIGNvZF9zdWljaWRlX25vdF9pY2UpICU+JSANCiAgZHJvcF9uYSgpICU+JSANCiAgZmlsdGVyKGNvZF9zdWljaWRlX2ljZT4wfGNvZF9zdWljaWRlX25vdF9pY2UgPjApICU+JSANCiAgbXV0YXRlKGNvZF9zdWljaWRlX3RvdGFsID0gY29kX3N1aWNpZGVfaWNlICsgY29kX3N1aWNpZGVfbm90X2ljZSkgJT4lIA0KICANCiAgIyBIZXJlIG9uZSBjb3VsZCBjYWxsIGRhdGF0YWJsZSgpIG9yIGthYmxlKCkNCiAgIyB0byBnZXQgYSBsaXN0IG9mIHRoZSBmYWNpbGl0aWVzIGFuZCBjb3VudA0KICANCiAgIyBJbml0aWF0ZSB0aGUgcGxvdA0KICBnZ3Bsb3QoYWVzKHg9Y29kX3N1aWNpZGVfdG90YWwsIHk9ZmFjaWxpdHkpKSsNCiAgZ2VvbV9ib3hwbG90KCkrDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKDEsMikpKw0KICBsYWJzKHRpdGxlID0gIkNhdXNlIG9mIERlYXRoIFN1aWNpZGUiLA0KICAgICAgIHN1YnRpdGxlID0gIkluY2x1ZGVzIElDRSBhbmQgbm9uLUlDRSBEZWF0aHMgYnkgU3VpY2lkZSIpKw0KICB4bGFiKCJDT0QgU3VpY2lkZSBUb3RhbCIpKw0KICB5bGFiKCJGYWNpbGl0eSIpDQpgYGANCg0KIyBPYnNlcnZhdGlvbnMNCg0KT2JzZXJ2YXRpb25zIG1hZGUgb24gdGhlIGRhdGEgYXMgdGhleSBhY2N1bXVsYXRlIGFyZSBsb2dnZWQgYmVsb3cuDQoNCiMjIDI4IE1heSAyMDIxDQoNCjEuICBBZGVsYW50byBJQ0UgUHJvY2Vzc2luZyBDZW50ZXIgLSBFYXN0IGFuZCBXZXN0IGhhdmUgaWRlbnRpY2FsIGRhdGEgZm9yIDIwMjAsIGJ1dCB0aGUgbnVtYmVycyBhcmUgZGlmZmVyZW50IGZvciAyMDE5IHdpdGggRWFzdCBiZWluZyBtdWNoIGxvd2VyIHRoYW4gd2VzdC4gQ3JhaWcgY2hlY2tlZCB0aGUgaW5zcGVjdGlvbnMgYW5kIHRoZSBudW1iZXJzIGFyZSBkaWZmZXJlbnQgZm9yIEVhc3QgYW5kIFdlc3QgaW4gMjAxOSB3aGlsZSB0aGV5IGFyZSBpbiBmYWN0IHRoZSBzYW1lIGZvciAyMDIwLiBOb3RlIHRoYXQgMjAyMCBpcyBhIHJlbW90ZSBpbnNwZWN0aW9uLiBIb3dldmVyLCBpdCBpcyBzaWduaWZpY2FudCB0aGF0IHRoZSB0d28gYXJlIGNvbXBhcmFibGUgaW4gb25lIGluc3RhbmNlIGFuZCBub3QgY29tcGFyYWJsZSBpbiBhbm90aGVyIGNhc2UuDQoNCjIuICBBbG1hbmNlIENvdW50eSBKYWlsIGFuZCBDaGFzZSBDb3VudHkgRGV0ZW50aW9uIENlbnRlciBib3RoIHNlZW0gdG8gcmVnaXN0ZXIgYmxhbmsgZm9yIHNvbGl0YXJ5LiBDcmFpZyBzdXNwZWN0cyB0aGlzIGlzIGJlY2F1c2UgdGhlcmUgd2VyZSBub3QgY2FzZXMgb2Ygc29saXRhcnkgcmVwb3J0ZWQuDQoNCiMjIDI3IE1heSAyMDIxDQoNCk9uZSBvZiB0aGUgaW1wb3J0YW50IGVhcmx5IG9ic2VydmF0aW9ucyBoYXMgdG8gZG8gd2l0aCB0aGUgbmFtaW5nIG9mIGZhY2lsaXRpZXMuIElDRSBpcyBvZnRlbiBpbmNvbnNpc3RlbnQgd2l0aCBmYWNpbGl0eSBuYW1pbmcgYW5kIHRoZSBuYW1lcyBkbyBvZnRlbiBjaGFuZ2Ugb3ZlciB0aW1lLiBCb3RoIHRoZSBjaGFuZ2luZyBvZiBuYW1lcyBhbmQgaW5jb25zaXN0ZW50IG5hbWluZyBjb252ZW50aW9ucyBjYW4gY2F1c2UgY29uZnVzaW9uIGFzIHdlbGwgYXMgZXJyb3Igd2hlbiB0YWJ1bGF0aW5nIHJlc3VsdHMuDQoNCjEuICBUaGUgZ3JhcGhzIGZvciAiKipBZGVsYW50byBJQ0UgUHJvY2Vzc2luZyBDZW50ZXIgLSBFYXN0KioiIGFuZCAiKipBZGVsYW50byBJQ0UgUHJvY2Vzc2luZyBDZW50ZXIgLSBXZXN0KioiIGFyZSBpZGVudGljYWwuIFRoaXMgaXMgY29uc2lzdGVudCB3aXRoIGluZm9ybWF0aW9uIENyYWlnIHJlY2FsbHMgc2VlaW5nIGluIG9uZSBvZiB0aGUgaW5zcGVjdGlvbnMsIHRoYXQgdGhlIG51bWJlcnMgZm9yIHRoZSBmYWNpbGl0aWVzIGFyZSAibWVyZ2VkIiBvciBjb21iaW5lZC4NCg0KICAgIC0gICBGb3IgZmFjZXQgZ3JhcGhpbmcgY29uc2lkZXIgZmlsdGVyaW5nLiBGb3IgYW5hbHlzaXMgcHVycG9zZXMgbWF5IG5lZWQgdG8gdHJlYXQgdGhlIHR3byBmYWNpbGl0aWVzIGFzICJtZXJnZWQiDQoNCjIuICAiKipBZGVsYW50byBJQ0UgUHJvY2Vzc2luZyBDZW50ZXIgV2VzdCoqIiBzaG91bGQgYmUgY29tYmluZWQgd2l0aCAiKipBZGVsYW50byBJQ0UgUHJvY2Vzc2luZyBDZW50ZXIgLSBXZXN0KioiLiBJdCBhcHBlYXJzIHRoYXQgSUNFIGlzIG5vdCBjb25zaXN0ZW50bHkgbmFtaW5nIHRoZSBmYWNpbGl0aWVzLCBpbiBvbmUgY2FzZSB0aGUgbmFtZSBsYWNrcyBhIGRhc2ggY2hhcmFjdGVyIHdoaWNoIGNhdXNlcyB0aGVtIHRvIGJlIGdyYXBoZWQgc2VwYXJhdGVseS4NCg0KICAgIC0gICBUaGUgZGFzaCB3YXMgYWRkZWQgdG8gQWRlbGFudG8gV2VzdC4NCg0KMy4gIEl0IHdvdWxkIGJlIGdvb2QgdG8gY2hlY2sgaWYgdGhlcmUgcmVhbGx5IHR3byBmYWNpbGl0aWVzIGluIEFsbWFuY2UgQ291bnR5LiBUaGVyZSBhcmUgZW50cmllcyBsaXN0ZWQgZm9yICIqKkFsbWFuY2UgQ291bnR5IERldGVudGlvbiBDZW50ZXIqKiIgYW5kICIqKkFsbWFuY2UgQ291bnR5IEphaWwqKiIuDQoNCiAgICAtICAgTmVlZCB0byB2ZXJpZnkgdGhhdCB0aGVzZSBhcmUgaW4gZmFjdCBkaXN0aW5jdCBmYWNpbGl0aWVzLg0KDQo0LiAgIioqQXVyb3JhIElDRSBQcm9jZXNzaW5nIENlbnRlciBJSSAtIEFubmV4KioiIGFuZCAiKipBdXJvcmEgSUkgQW5uZXgqKiIgc2hvdWxkIHByb2JhYmx5IGJlIGNvbWJpbmVkLiBOZWVkIHRvIGNoZWNrIHRoZSBpbnNwZWN0aW9ucyB0byB2ZXJpZnkuDQoNCiAgICAtICAgIioqQXVyb3JhIElJIEFubmV4IChDTykgLSBKYW4uIDI5LCAyMDIxIioqIHdhcyBjaGFuZ2VkIHRvICIqKkF1cm9yYSBJQ0UgUHJvY2Vzc2luZyBDZW50ZXIgSUkgLSBBbm5leCAoQ08pIC0gSmFuLiAyOSwgMjAyMSoqIg0KDQojIFJlZmVyZW5jZXMNCg0KOjo6IHsjcmVmc30NCjo6Og0KDQpgYGB7ciBwYWNrYWdlLXJlZmVyZW5jZXMsIGVjaG89RkFMU0V9DQprbml0cjo6d3JpdGVfYmliKGZpbGUgPSAncGFja2FnZXMuYmliJykNCmBgYA0K